前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >对线面试官-MySQL(一)

对线面试官-MySQL(一)

作者头像
@派大星
发布2023-09-08 17:15:10
发布2023-09-08 17:15:10
1210
举报
文章被收录于专栏:码上遇见你码上遇见你

面试官:MySQL 的存储引擎了解哪些?

派大星:MySQL支持多种的存储引擎,以下是比较常见的存储引擎:

  • InnoDB:InnoDB是MySQL默认的事务性存储引擎。它提供了ACID事务支持以及行级锁。适用于大多数场景,尤其是和处理并发性能和数据完整性要求较高的应用。
  • MyISAM:MySQL5.1版本之前默认的存储引擎,它不支持事务和行级锁定,但是具有较高的性能和较低的存储空间需求,还支持全文索引、压缩、空间函数等特性。适用于读取密集型的应用场景。
  • MEMORY:(或HEAP)MEMORY将数据存储在内存中,提供了非常快的读写操作,然而,数据只在MySQL运行时存在,在服务器关闭后消失。

面试官:那你可以说一说MySQL中的InnoDB和MyISAM存储引擎的联系与区别嘛?

派大星:好的,InnoDB支持事务和行级锁定以及外键,MyISAM不支持事务和行级锁定以及外键。从索引的数据结构来说:虽然两个存储引擎使用的都是B+树,但是却有些区别。

  • InnoDB中B+树的数据机构中存储的是实际数据(树的叶子节点存的是数据本身,5.7之后支持全文索引),这种索引被称为聚簇索引.
  • MyISAM中B+树中的数据结构中存储的都是实际数据的地址值,它的索引和实际数据是分开的,只不过使用了索引指向了实际数据(树的叶子节点存储的不是数据,而是数据存放的地址,支持全文索引)。这种索引模式称之为非聚簇索引

面试官:为什么MySQL采用B+树作为索引结构而不是B树,什么是B+树?

派大星:之所以MySQL使用B+树作为索引结构,大致有如下原因:

B树的键和值都可以存储在内部节点(非叶子节点)。B+树内部节点都是键,只有叶子节点存储了实际的键和值,并且B+树的叶子节点中各个节点是相连的,在MySQL中还是双向链表;而B树是各自独立的。

  • 使用B树的好处是在非叶子节点同时存储键和值,因此把访问频繁的数据放在靠近根节点的地方,可以提高热点数据的查询效率
  • 使用B+树的好处是:因为它的内部节点只存放键,一次读取可以在内存中获取更多的键,从搜索的角度来说,范围会更小一点,并且B+树的叶子节点是一个双向链表,对于全量数据遍历的话,时间复杂度仅仅需要一个O(log(N))的时间找到最小的节点,然后通过链表的形式顺序遍历即可,而B树需要对数据的每一层都需要遍历。

派大星:之所以MySQL采用B+树而不是B树,原因是B树只是适合一个随机检索的场景,但是B+树同时支持随机检索和顺序检索,B+树的空间利用率更高,能够有效减少IO次数,性能从而会更好一点。一般来说索引也是很大的不可能都存放在内存中,所以说所以一般是以文件的形式存放在磁盘上的,这样我们索引查找是要产生磁盘IO的。B+树内部的节点只是作为索引使用,所以其内部的结构大小是要比B树要小的,自然而然盘块能够容纳节点中的关键字数量更多,一次读到内存的关键字数也就更多,IO减少性能也就上升了。

派大星:还有一个重要的因素是B+树更加的稳定。因为B树的查找可能在非叶子节点就结束了,越靠近根节点查找时间越短,性能等价于在关键字里面做一个二分查找。而在B+树里面顺序检索比较明显,随机检索的时候找到任何的关键字都必须要从一个根节点走到叶子节点,所有关键字的查找路径是差不多的。而且在我们增删文件的时候,因为B+树的叶子节点是包含了所有的关键字的,而且是通过有序链表存储的,所以在进行增删的时候效率也会更高

总结:

  • B+树能显著减少IO次数,从而提高效率。
  • B+树的查询效率更加稳定,因为数据放在叶子节点。
  • B+树能提高范围查询的效率,因为叶子节点指向下一个叶子节点。

面试官:嗯,那你知道InnoDB的事务是怎么实现的嘛?

派大星:知道,提到事务我们都知道ACID 原子性、一致性、隔离性、持久性。

  • Atomic:原子性,简单来将就是要么一起成功,要么一起失败,它是有undo log来保证的,undo log记录了需要回滚的日志,事务回滚时,撤销已经执行成功的sql。
  • Consistency :一致性,就是一组SQL执行之前数据是准确的,执行之后数据也必须是准确的,由其它三大特性来保证,程序代码保证业务的一致性。
  • Isolation :隔离性,多个事务执行互相不受影响,它是由MVCC和锁来保证的。
  • Durability :持久性,事务成功了,就必须保证对数据的修改是永久有效的。它是由内存+Redo Log来保证的,MySQL在修改数据的同时在内存和redo log记录本次操作,宕机的时候可以从redo log来恢复。

派大星:大致流程是当我们在提交事务的时候就会把redo log日志写入磁盘文件中,并且在提交事务的时候还会把这次更新对应的binlog日志写入到磁盘文件中,从提交事务开始就属于提交事务阶段了;当我们把bin log写入到磁盘文件中后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置,都写入到redo log 日志中去,同时在redo log日志文件里写入一个commit标记。

面试官:不错。看来你对MySQL的理解挺深入。

派大星:感谢您的评价

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档