MySQL的索引机制中,有一点可谓是路人皆知,既默认使用B+树作为底层的数据结构。
索引为何不选择二叉树?
二叉搜索树是遵守二分搜索法实现的一种数据结构,它具有下面特点:
- 任意节点的左节点不为空时,左节点值小于根节点值;
- 右节点不为空时,右节点值大于根节点值;
依次存入数据,如果数据是递增的,则原二叉树退化为链表结构。
因此二叉树不适合作为索引结构的原因:
- 如果索引的字段值是按顺序增长的,二叉树会转变为链表结构,因此检索的过程和全表扫描无异。
- 每个节点中只存储一个数据,节点之间还是不连续的,每次磁盘IO只能读取一个数据。
索引为何不选择红黑树?
相比于二叉树,红黑树则进一步做了优化,它是一种自适应的平衡树,会根据插入的节点数量以及节点信息,自动调整树结构来维持平衡。
红黑树不适合作为索引结构的原因:
- 虽然对比二叉树来说,树高有所降低,但数据量一大时,依旧会有很大的高度。
- 每个节点中只存储一个数据,节点之间还是不连续的,每次磁盘IO只能读取一个数据。
索引为何不选择B-Tree?
B树和红黑树相比,其单节点可容纳多个数据,就能在很大程度上改善其性能,使B树的树高远远小于红黑树的高度。
B树不适合作为索引结构的原因:
- 虽然对比之前的红黑树更矮,检索数据更快,但对于大范围查询的需求,依旧需要通过多次磁盘IO来检索数据。
索引为何要选择B+Tree?
B+树是在B树的基础进一步优化,一方面节点分为了叶节点和叶子节点两类,另一方面叶子节点之间存在单向链表指针。
B+树相比于B树叶子节点之间多了个单项指针,当需要做范围查询时,只需要定位第一个节点,然后就可以直接根据各节点之间的指针,获取到对应范围之内的所有节点,也就是只需要发生一次IO,就能够确定所查范围之内的所有数据位置。
其实MySQL底层真正的索引结构还对叶子节点之间的指针进行了优化,B+树叶子节点的单向指针无法友好支持的倒叙查询,因此MySQL针对单向指针优化成了双向指针,也就是双向链表结构。即可以快速按正序进行范围查询,而可以快速按倒序进行范围操作,在某些业务场景下又能进一步提升整体性能!
节点分为了叶节点和叶子节点。为什么?
因为B+树的叶节点不存储数据,仅存储指向叶子节点的指针,这样在相同树高时,能存储更多的数据,需要注意的是叶节点数据与叶子结点数据是冗余的。
现在对于MySQL索引为何要选择B+树(变种)的原因大家应该懂了吧。