目录
1、mysql的存储引擎?有什么区别?优点,缺点,什么场景是用什么?
4、事务是什么?mysql事务的特性?ACID?MySQL并发事务带来的问题?事务隔离级别?mysql默认隔离级别?
10、索引是什么? 分类? 作用? 索引失效? 失效原理?(最左前缀)
1、mysql的存储引擎?有什么区别?优点,缺点,什么场景是用什么?
答:MyISAM和InnoDB,InnoDB是mysql5.5及之后默认使用的存储引擎。InnoDB支持事务、外键,MyISAM不支持。MyISAM只缓存索引,不缓存真实数据。而InnoDB不仅缓存索引还要缓存真实数据。MyISAM不适合高并发的操作,因为它是表锁,操作一行记录会锁住整张表,而InnoDB是行锁,写操作是不会锁定全表的,适合并发度较高的场景。MyISAM当进行 select count(*) from table 语句时,不需要进行全表扫描,因为它底层维护了一个计数器,提前将表的总行数存储起来,定期维护。而InnoDB需要进行全表扫描。如果表的读操作远远多于写操作时,并且不需要事务支持的,可以考虑用MyIASM。
InnoDB是聚簇索引,数据文件和索引文件是绑在一起的。MyISAM是非聚簇索引,索引文件与数据文件是分离的。InnoDB的B+树主键索引的叶子节点存放的就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
2、innodb是什么索引?为什么查主键索引会比较快?
答:innodb是聚簇索引。因为innodb的主键索引与数据文件是绑在一起的,而辅助索引的话就得需要两次查询才能找到数据,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键过大的话,索引也会变大。
3、说一下 mysql 的行锁和表锁?
答:MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。表级锁:开销小,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率最高,并发量最低。行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率小,并发度最高。
4、事务是什么?mysql事务的特性?ACID?MySQL并发事务带来的问题?事务隔离级别?mysql默认隔离级别?
答:事务是SQL语句被当做一个整体,要么都执行成功,要么都执行失败。四大特性。原子性、一致性、隔离性、持久性。原子性指的是一个事务里的命令要么全部执行,要么全部不执行,如果中间发生了错误,会导致前面的命令回滚,后面的命令不再执行。一致性指执行事务前后,数据保持一致。例如银行转账,不管转账成功与否,转账前后总额是不变的。隔离性指的是一个事务执行不会影响另一个事务的执行。持久性指的是事务完成之后,对数据库所做的更改将持久地保存在数据库中,并不会被回滚。并发事务带来的问题有脏读、丢失更新、不可重复读、幻读。脏读指的是一个事务对数据进行了修改还没有提交到数据库中,若此时另一个事务前来查询这条数据,查到的就是未提交的数据,即”脏数据“,如果刚才那条数据回滚了,则查询到的数据是无效的。不可重复读是指一个事务内两次读到的数据是不一样的情况,由于另一个事务对数据进行了修改并提交,导致第二次读到的数据不一致的情况。幻读的重点在于新增或者删除,第一个事务刚开始读取到几行数据,第二个事务进行了删除或修改后,第一个事务再去读取就会发现多了或少了几行数据,就像发生了幻觉一样。丢失更新指的是当两个或多个事务修改同一行,由于不知道其它事务的存在,最后的更新覆盖了其他事务所做的更新,导致更新丢失。mysql默认隔离级别有读未提交、读已提交、可重复读、串行化。默认隔离级别是可重复读。
5、数据库事务的实现原理?
答:以 MySQL 的 InnoDB 引擎为例来简单说一下。MySQL InnoDB 引擎使用redo log(重做日志)保证事务的持久性,使用undo log(回滚日志)来保证事务的原子性。MySQL InnoDB 引擎通过锁机制、MVCC等手段来保证事务的隔离性(默认支持的隔离级别是 REPEATABLE-READ
)。保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。
原子性实现:是用undolog实现的,undolog的意思是回滚日志,指的是每次在有写命令的时候,会先向undolog中写入一份,如果中间发生了故障,就可以通过undolog进行回滚,比如说如果是insert命令只要delete就可以了,delete命令只要insert就可以了,update命令只要更新回原来的值就可以了。
持久性实现:是用redolog实现的,重做日志,mysql在读取或者修改数据的时候并不是直接进行读取修改的,而是用到了缓存的概念,因为如果每次读取修改都要对