为什么 MySQL 选择使用 B+ 树作为索引结构?
主要是数据结构方面的分析
查询性能高
B+tree是一种平衡树,每个叶子节点到根节点的路径长度相同,其在插入和删除时会进行分裂合并,以维持树的平衡,会有一定的冗余节点,使得删除时数的结构变化小,更高效。(自平衡也是会有性能损耗的);
查找、插入、删除等操作的时间复杂度为 O(log n)
数的高度增长不会过快,查询磁盘的I/O次数减少
B+tree是一种多叉树,非叶子节点仅保存主键或索引值和页面指针,这样每一页能够容纳更多的记录,内存中就可以存放更多索引,容易命中缓存,使得查询磁盘的I/O次数减少。
减少树的高度,提高检索效率;
范围查询能力强
叶子节点使用双向链表链接,从跟节点定位到叶子结点,查找到范围的起点后,只需要顺序扫描链表即可遍历后续数据,十分高效。
B树和B+树的区别
B树每个节点存放了完整的数据,而B+树非叶子节点仅存储key和指针,完整数据存放在叶子节点。这使得B+树可以在内存中存放更多的索引页,减少磁盘的查询次数;
B+树叶子节点组成了链表,便于区间扫描,而B树只能每一层遍历查找;
B+树查询时间更平均、稳定,都需要从跟节点扫描到叶子节点。而B树在非叶子节点就可能找到数据返回。
评论