面试官:MySQL 的存储引擎了解哪些?
派大星:MySQL支持多种的存储引擎,以下是比较常见的存储引擎:
面试官:那你可以说一说MySQL中的InnoDB和MyISAM存储引擎的联系与区别嘛?
派大星:好的,InnoDB支持事务和行级锁定以及外键,MyISAM不支持事务和行级锁定以及外键。从索引的数据结构来说:虽然两个存储引擎使用的都是B+树,但是却有些区别。
聚簇索引
.非聚簇索引
面试官:为什么MySQL采用B+树作为索引结构而不是B树,什么是B+树?
派大星:之所以MySQL使用B+树作为索引结构,大致有如下原因:
B树的键和值都可以存储在内部节点(非叶子节点)。B+树内部节点都是键,只有叶子节点存储了实际的键和值,并且B+树的叶子节点中各个节点是相连的,在MySQL中还是双向链表;而B树是各自独立的。
派大星:之所以MySQL采用B+树而不是B树,原因是B树只是适合一个随机检索的场景,但是B+树同时支持随机检索和顺序检索,B+树的空间利用率更高,能够有效减少IO次数,性能从而会更好一点。一般来说索引也是很大的不可能都存放在内存中,所以说所以一般是以文件的形式存放在磁盘上的,这样我们索引查找是要产生磁盘IO的。B+树内部的节点只是作为索引使用,所以其内部的结构大小是要比B树要小的,自然而然盘块能够容纳节点中的关键字数量更多,一次读到内存的关键字数也就更多,IO减少性能也就上升了。
派大星:还有一个重要的因素是B+树更加的稳定。因为B树的查找可能在非叶子节点就结束了,越靠近根节点查找时间越短,性能等价于在关键字里面做一个二分查找。而在B+树里面顺序检索比较明显,随机检索的时候找到任何的关键字都必须要从一个根节点走到叶子节点,所有关键字的查找路径是差不多的。而且在我们增删文件的时候,因为B+树的叶子节点是包含了所有的关键字的,而且是通过有序链表存储的,所以在进行增删的时候效率也会更高
总结:
面试官:嗯,那你知道InnoDB的事务是怎么实现的嘛?
派大星:知道,提到事务我们都知道ACID 原子性、一致性、隔离性、持久性。
undo log
来保证的,undo log
记录了需要回滚的日志,事务回滚时,撤销已经执行成功的sql。MVCC
和锁来保证的。内存
+Redo Log
来保证的,MySQL在修改数据的同时在内存和redo log
记录本次操作,宕机的时候可以从redo log
来恢复。派大星:大致流程是当我们在提交事务的时候就会把redo log
日志写入磁盘文件中,并且在提交事务的时候还会把这次更新对应的binlog
日志写入到磁盘文件中,从提交事务开始就属于提交事务阶段了;当我们把bin log
写入到磁盘文件中后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog
文件名称和这次更新的binlog日志在文件里的位置,都写入到redo log
日志中去,同时在redo log
日志文件里写入一个commit标记。
面试官:不错。看来你对MySQL的理解挺深入。
派大星:感谢您的评价