Mysql 索引之B树和B+树

264 阅读2分钟

11.3.为什么要用 B+ 树,而不用普通二叉树?

可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数。

为什么不用普通二叉树?

普通二叉树存在退化的情况,如果它退化成链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。

为什么不用平衡二叉树呢?

读取数据的时候,是从磁盘读到内存。如果树这种数据结构作为索引,那每查找一次数据就需要从磁盘中读取一个节点,也就是一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是 B+ 树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快。

#11.4.为什么用 B+ 树而不用 B 树呢?

先讲讲基本的B树和B+树

B树

B+ 树

树中一个节点存储在一个磁盘块中,磁盘快大小是固定的一般是1KB,B 树的数据和索引放在一起,B+ 树的数据全部放在叶子节点上。

B+树的叶子节点用指针进行相连。B树叶子节点是分开的。

B+相比较 B 树,有这些优势:

  • 扫库、扫表能力更强

    如果我们要对表进行全表扫描,只需要遍历叶子节点就可以 了,不需要遍历整棵 B+Tree 拿到所有的数据。

  • B+Tree 的磁盘读写能力相对于 B Tree 来说更强,IO 次数更少

根节点和枝节点不保存数据区, 所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多,IO 次数更少。

  • 排序能力更强

因为叶子节点上有下一个数据区的指针,数据形成了链表。

  • 效率更加稳定

B+Tree 永远是在叶子节点拿到数据,所以 IO 次数是稳定的。