关于Mysql索引数据结构为什么要选用B+tree随笔
数据结构
如果想要了解为什么会选用B+tree,首先我们需要好好了解目前所知的存储数据的一些数据结构
二叉树
二叉树,想必大家不会陌生,因为在我们刚学计算机数据结构想必大家都有学过二叉树,他的数据结构特点是以根节点为头,每次插入的数据右边的总会大于左边的数据,以此来展开相应的数据存储
那么为什么我们Mysql不选用二叉树呢,这里我们设想一个场景,假设我们每一次插入的数据比上一个数据依次递增,那么我们会得到一个什么样得数据结构呢
此时虽然说也是树形结构,其实跟链表也没什么两样,众所周知索引其实也是存储在磁盘中的,假设我们现在要查询06这条数据,那么此时我们就需要经过5次查找才能找到,而当我们的数据量上百万的时候呢,这样的查询效率显然是不行的
红黑树(二叉平衡树)
那么我们再来聊聊红黑树,红黑树其实跟二叉树的大致结构是一致的,只不过他会在每一次插入数据的时候,他会对当前数据结构进行一次平衡
这也是为什么他又称为二叉平衡树的缘由。那么为什么我们依然不选择红黑树呢,其实也和二叉树差不多,尽管红黑树能对数据结构进行平衡,但是当我们数据量大的时候,树的高度其实依然很高,此时的查询效率依旧不理想
B-tree
关于B树,有三大特点
- 叶节点有相同的深度,叶结点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列
这时的结构已经很接近Mysql选择的数据结构了,在说B+tree之前,我先说明一下B树如果作为索引结构的特点。
B树插入数据之前它会先设置它一层节点能存多少索引(索引中包含携带数据),这里我用图片演示,假设我们设置的为一层四个数据节点
当我们继续插入数据的时候
可以看出来,当我们一层数据大于等于设置的个数之后,它会自动帮我们进行数据平衡,保证每一层数据都在这个范围以内,并且每一层的数据从左到右依次递增
假如此时我们要查询某一个数据节点,他会先把根节点的数据放入内存中进行比对,然后基于数据的有序性快速查找到我们需要的数据处于哪两个数之间,从而快速定位到下一层的节点上(此时的定位是基于磁盘查找),这里它每一个节点会携带该数据在磁盘的具体位置,从而完成数据的查询。
B+tree
其实到B树那里相较于前两种结构已经很优化了,但是Mysql最终也并没有选择,也是因为B树相较于B+tree仍然有进步的空间
B+tree,其实也成为B树的变种,其数据结构如下
相较于B树,这里优化了几个地方
- 携带数据及数据的磁盘存储地址统一存入叶子节点之中,设计理由:因为当我们的非叶子节点不存储该数据的时候,它占用的磁盘空间会更小,从而放入内存查询的速度也会比之前快,而且当非叶子节点不存储携带数据之后,也能使一个节点存储更多的索引,从而尽可能降低树的高度
- 叶子节点之间带有双向链表,设计理由:当我们进行索引的范围查找时,比如要查询 “>15” 的数据时,B树需要每一次查询到一个数据时,下一次比对会重新回到上一个节点去进行查询比对,而B+tree却能通过双向链表的形式直接进行叶子结点的数据比对,相较于B树,大大优化了查询效率,这也是mysql为什么会选择B+tree来作为索引的数据结构的原因了
最后,如果我的文章对你学习Mysql索引相关知识有帮助的话,希望能收到你的点赞和好评🤭