MySQL的索引机制中,有一点可谓是路人皆知,既默认使用B+树作为底层的数据结构,有人会说树结构是以二分法查找数据,所以会在很大程度上提升检索性能,这点确实没错,但树结构有那么多,但为什么要选择B+树呢?而不选择二叉树、红黑树或B树呢?下面一起聊一聊这个话题。
为何不选择二叉树?
二叉搜索树是遵守二分搜索法实现的一种数据结构,它具有下面特点:
- 任意节点的左子树不为空时,左节点小于根节点;
- 右节点不为空时,右节点大于根节点;
- 任意子树也是二叉搜索树;
依次存入数据,如果数据是递增的,则原二叉树退化为链表。
为何不选择红黑树?
相比于二叉树,红黑树则进一步做了优化,它是一种自适应的平衡树,会根据插入的节点数量以及节点信息,自动调整树结构来维持平衡
①虽然对比二叉树来说,树高有所降低,但数据量一大时,依旧会有很大的高度。
②每个节点中只存储一个数据,节点之间还是不连续的,每次磁盘IO只能读取一个数据。
为何不选择B树?
B树和红黑树相比,其单节点可容纳多个数据,就能在大程度上改善其性能,使B树的高度远小于红黑树的高度。
我们仔细观察可以知道B树的叶子节点直接是没有指针的,但是日常查询中包含了大量的范围查询,所以当出现范围查找的时候,会出现多次的IO查找。
①虽然对比之前的红黑树更矮,检索数据更快,但对于大范围查询的需求,依旧需要通过多次磁盘IO来检索数据。
为何选择B+树?
B+树是在B树的基础进一步优化,一方面节点分为了叶节点和子节点两类,另一方面叶子节点之间存在单向链表指针。
- 叶节点不存储实际数据,主要用于索引和加速查找;
- 叶子节点存储数据,所有叶子节点通过链表连接,便于范围查询
- 这种设计相对于B树相同高度能够存储更多数据
其实MySQL底层真正的索引结构还对叶子节点之间的指针进行了优化,B+树叶子节点的单向指针无法支持倒序查询,因此MySQL针对单向指针优化成了双向指针,也就是双向链表结构,在某些业务场景下又能进一步提升整体性能!