mysql数据库索引面试题 mysql组合索引底层原理( 二 )


(当我把皱皱巴巴的简历交给面试官后,这场面试才得以继续进行 。。。)
MySQL索引底层数据结构
面试官:我看你简历上写的精通MySQL?(哼,面试官轻蔑的一笑)
(看着面试官轻蔑的笑容,我忍不住拿出了我的MySQL入门书籍推给了他)
我:这本书我倒背如流,你随便提问,答不上来算我输,答上来你就要为你的轻蔑向我道歉 。

mysql数据库索引面试题 mysql组合索引底层原理

文章插图

(我的笑容逐渐自信 。。。)

mysql数据库索引面试题 mysql组合索引底层原理

文章插图
(此时面试官笑的更大声了,完全不在意我就坐在对面)
面试官:哈哈哈、你这本书都写了MySQL入门了,你还敢说你精通MySQL,我随便问你一个问题就把你问住了,因为我问的问题都是你这本书上没有的
我:那你问吧,是骡子是马咱拉出来溜溜 。
面试官:好,小伙子还挺硬气,那你说说MySQL索引的底层数据结构吧
我:MySQL索引的底层数据结构是B+树数据结构(这有何难 。。。)
面试官:完了?详细介绍一下B+树的数据结构是什么样子的,不然我怎么知道你真懂假懂
我:B+树有三个特性
1、B+树是一个平衡多叉树,与平衡二叉树的每一个节点下面最多有两个子节点相比B+树每一个节点下面有多个子节点 。
2、B+树叶子节点(也就是最下面一层的没有子节点的节点)有一个双向链表,左右是为了方便范围查找(假如我找前100条数据,那么我找到第一条叶子节点的数据就可以从叶子节点直接向后取100个数据即可,不用再从根节点向下寻找)
3、B+树的叶子节点有data数据(就是数据库中这一条所有的字段数据),非叶子节点只有索引数据 。

mysql数据库索引面试题 mysql组合索引底层原理

文章插图

面试官:嗯,那你说一下B树和B+树的区别,为什么MySQL底层使用B+树而不使用B树呢
我:(很明显啊!B+比B多一个+啊,年底了能拿A+的谁爱拿A呢,这一题过 。。。)
我们先来看一下B树的一个数据结构

mysql数据库索引面试题 mysql组合索引底层原理

文章插图

很明显B树与B+树有两个地方不同,一个是叶子节点的双向链表,一个是B树不是只有叶子节点有data数据,而是所有的节点都有data数据 。
面试官:嗯 。那为什么不用二叉树作为索引的底层结构而用B+树呢
我:因为二叉树的特性造成根节点距离叶子节点的路径太长,假如一个7个节点的数据二叉树从根节点到叶子节点的距离为三 。
mysql数据库索引面试题 mysql组合索引底层原理

文章插图

如果用B+树则距离为1就可以搞定(当然B+树一层不止7个节点,节点数量取决于一页数据能存放多少个节点)
mysql数据库索引面试题 mysql组合索引底层原理

文章插图
面试官:嗯,每一个节点都有data数据不是更好吗,不需要到达叶子节点就可以获取数据返回了,为什么B+树还要把其他节点的data数据去掉,只留叶子节点的data数据呢
我:因为这里涉及到计算机中的IO操作,计算机IO一次只能拿一数据页的数据(姑且认为大小为64KB吧),如果每一个节点都有data数据,那么计算机IO一次可能只够拿一个节点出来,这样,可能IO一百次才能找到结果,如果其他节点不存储data数据,那么这个索引占用空间就少,IO一个可以拿出多个节点来,这样IO的次数就大大降低了,IO一次是比较耗费性能的,所以使用B+树就提高了性能 。
【mysql数据库索引面试题 mysql组合索引底层原理】面试官:可以啊小伙子,有点东西,平时都怎么学习呀,回答的这么全面
我:平时都是看看小奇的《趣学编程》系列文章,文章简答又有趣,利用闲暇时间就慢慢得到了升华(此时真想给小奇的文章点个赞,拒绝白嫖哦,不点赞就很坏~~)


推荐阅读