B 树和B+树的区别?(深入精讲)

MySQL的索引机制中,有一点可谓是路人皆知,既默认使用B+树作为底层的数据结构。

索引为何不选择二叉树?

二叉搜索树是遵守二分搜索法实现的一种数据结构,它具有下面特点:

  • 任意节点的左节点不为空时,左节点值小于根节点值;
  • 右节点不为空时,右节点值大于根节点值;

依次存入数据,如果数据是递增的,则原二叉树退化为链表结构。

因此二叉树不适合作为索引结构的原因:

  1. 如果索引的字段值是按顺序增长的,二叉树会转变为链表结构,因此检索的过程和全表扫描无异。
  2. 每个节点中只存储一个数据,节点之间还是不连续的,每次磁盘IO只能读取一个数据。
索引为何不选择红黑树?

相比于二叉树,红黑树则进一步做了优化,它是一种自适应的平衡树,会根据插入的节点数量以及节点信息,自动调整树结构来维持平衡。

红黑树不适合作为索引结构的原因:

  1. 虽然对比二叉树来说,树高有所降低,但数据量一大时,依旧会有很大的高度。
  2. 每个节点中只存储一个数据,节点之间还是不连续的,每次磁盘IO只能读取一个数据。
 索引为何不选择B-Tree?

B树和红黑树相比,其单节点可容纳多个数据,就能在很大程度上改善其性能,使B树的树高远远小于红黑树的高度。

 B树不适合作为索引结构的原因:

  1. 虽然对比之前的红黑树更矮,检索数据更快,但对于大范围查询的需求,依旧需要通过多次磁盘IO来检索数据。
索引为何要选择B+Tree?

B+树是在B树的基础进一步优化,一方面节点分为了叶节点和叶子节点两类,另一方面叶子节点之间存在单向链表指针

B+树相比于B树叶子节点之间多了个单项指针,当需要做范围查询时,只需要定位第一个节点,然后就可以直接根据各节点之间的指针,获取到对应范围之内的所有节点,也就是只需要发生一次IO,就能够确定所查范围之内的所有数据位置。
其实MySQL底层真正的索引结构还对叶子节点之间的指针进行了优化,B+树叶子节点的单向指针无法友好支持的倒叙查询,因此MySQL针对单向指针优化成了双向指针,也就是双向链表结构。即可以快速按正序进行范围查询,而可以快速按倒序进行范围操作,在某些业务场景下又能进一步提升整体性能!
节点分为了叶节点和叶子节点。为什么?
因为B+树的叶节点不存储数据,仅存储指向叶子节点的指针,这样在相同树高时,能存储更多的数据,需要注意的是叶节点数据与叶子结点数据是冗余的。
现在对于MySQL索引为何要选择B+树(变种)的原因大家应该懂了吧。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值