1、什么是脏读、幻读和不可重复读?
脏读:
脏读是指当一个事务再访问数据并进行修改时,这个修改还没有提交时,另外一个事务也访问这条数据并使用这条数据;
例如:事务一将一条数据的字段A从100改为200,但是没有提交;这时另外一个事务访问这条数据,看到了被修改为200的数据,但是事务一操作有误发生回滚,字段A又变为了100;
幻读:
幻读是指当事务不是独立执行时发生的一种现象。比如第一个事务对一个表中的数据进行了修改,这个修改涉及到表中的全部数据行。同时,另外一个事务向表中插入一行新的数据。那么就会发现,操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。
例如:事务一读取所有字段A等于100的记录,假设有十条,这时事务2向表中新增了一条字段A等于100的记录,那么事务1再次读取时,会读到11条;
解决办法: 在操作事务完成数据处理之前,任何其他事务都不可以添加新数据;
不可重复读:
不可重复读是指在同一个事务内,多次读同一数据,当这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务的两次读数据之间,由于第二个事务的修改操作,那么第一个事务的两次读到的数据可能是不一样的。
例如:事务一读取字段A为100,这时另一个事务修改了字段A为200,事务一中再读取A,就变为200;
解决办法: 只有在修改事务完全提交之后,才可以读取数据;
—-> 不可重复读的重点在于修改,同样的条件,读取过的数据,再次读取出来发现值不一样了;
幻读的重点在于新增或删除,同样的条件,第一次和第二次读出来的记录数不一样了;
2、MySql数据库事务隔离级别?
- 读未提交(READ UNCOMMITTRD):它是事务之间最小限度的隔离,脏读、幻读、不可重复读都可能会出现;
- 读已提交(READ COMMITTED):比读未提交隔离级别安全性高些,在这里可能会产生幻读和不可重复读的问题;
- 可重复读(REPEATABLE READ):这种隔离级别下,可能产生幻读;
- 串行化(SERIALIZABLE):这时事物之间最大限度的隔离,安全性最高,不会产生安全问题,但同时性能极差;
—->MySql默认的隔离级别是REPEATABLE READ,可重复读,因为它需要保证事务ACID特性中的隔离性,同时性能方面也不错。
3、事务的四大特性?
什么是事务:事务是用户定义的一个数据操作序列,这些操作要么全做,全么全不做,是一个不可分割的工作单位。
事务的四大特性为ACID:
- A:原子性,atomicity:
事务的原子性,是指事务中的操作要么一起成功,要么一起失败,即事务提交commit和事务回滚rollback;
C:一致性,consistency:
事务的一致性,是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行前和执行后,数据库都必须处于一致性的状态,比如A账户向B账户转账,不可能A扣了钱,B没有加钱;
I:隔离性,isolation:
事务的隔离性,是指在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰;
D:持久性,durability:
事务的持久性,是指事务一旦提交后,数据库中的数据必须被永久保存下来;
4、索引的种类?
- 普通索引:基本的索引,没有让你和限制,用于加速查询,数据可以重复;
- 组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被引用;
- 全文索引:用来查找文本中的关键字;
- 唯一索引:索引列的值必须唯一,但允许有空值;如果是组合索引,则列值的组合必须唯一;
- 主键索引:特殊的唯一索引,一个表只能又一个主键,不允许有空值,一般是在建表的同时创建主键索引;也就是在唯一索引的基础上,相应的列必须为主键;
5、使用索引的优缺点?
有点事可以通过索引提高查询的性能,减少查询时间;
缺点是增加索引需要占用一定的物理空间,当基本表更新世,索引要进行相应的维护,这些都会增加数据库的负担;
6、什么情况下,索引会失效?
- 对列进行计算或者使用函数时;
- where语句中使用了is null可以使用索引,但是is not null不能使用索引;
- 在where中使用or时,如果有一个列没有索引,那么其他列的索引将不起作用;
- 不匹配数据类型,会造成索引失效;(比如列类型是字符串,那么一定要在条件中将数据用引号引起来,否则索引失效)
- like查询以%开头;
- 还有其他;
7、什么情况下需要使用索引?
- 列经常被用where查询条件中
- 列中有大量的空值
- 表几乎没有被需改
- 数据量很大,但只有很少一部分,比如2%-4%的数据被筛选出来
8、谈一下mysql数据的存储引擎,比如InnoDB和MyISAM的区别?
存储引擎是用于存储数据的核心组件;是如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法;我们使用SQL语句进行对数据的操作,实际上是通过存储引擎来操作的;
Mysql默认使用InnoDB存储引擎(在mysql5.5以后);
Mysql有InnoDB、MyISAM、Memory等操作引擎; 其中memory存储引擎将数据存储到内存中而不是硬盘;
InnoDB和MyISAM的区别:
- InnoDB支持事务,而MyISAM不支持;
- InnoDB适合频繁修改以及涉及到安全性较高的应用,MyISAM适合查询以及插入为主的应用;
- InnoDB支持外键,而MyISAM不支持;
- InnoDB不支持全文类型(FULLTEXT)的索引;
- InnoDB中不保存表的行数,比如select count(*)时,InnoDB需要扫描一遍整个表来计算有多少行,而MyISAM只需要简单的读出保存好的行数即可;
- 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是MyISAM中可以和其他字段一起建立联合索引;
- 清空整个表时,InnoDB是一行一行删除的,而MyISAM则会重建表;
- InnoDB支持行锁;
9、数据库三范式?
第一范式:1NF;属性不可再分;即s表中的字段不能再被分隔,不能再分为多个其他的字段;
1NF 是所有关系型数据库的最基本要求 ,也就是说关系型数据库中创建的表一定满足第一范式。
第二范式:2NF;在第一范式的基础上,消除非主属性对于码的部分函数依赖;
即 要求表要有主键,要求其他字段都依赖于主键;
第三范式:3NF;第三范式在第二范式的基础上,消除了非主属性对码的传递函数依赖; (任何非主属性不依赖于其它非主属性,即不能通过一个得到另一个)
即 消除冗余,基本上解决数据冗余过大,插入异常,修改异常,删除异常的问题;