树:从二叉树到B+树 | 青训营笔记

92 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第17天

在上篇文章中,我们了解了B树. B树相比二叉树,对每个节点的子节点的数量不做限制. B树的每个节点都可以存储数据. 在实际应用中,B树的存储方式是将每个节点作为一个逻辑块存储在磁盘中. 为了减少磁盘IO时间,我们将B树的高度压缩到一个较小的值,从而能够在较短的时间内从磁盘中查找数据. 我们还了解到了,B树 二叉树 链表的共同特点就是想要保证对查找和插入的加速有意义,就要保证数据都是有序的. 本篇我们介绍一下B树的升级版: B+树.

什么是B+树?为什么要有B+树? 我们还得从B树讲起. 我们知道, B树中每个节点都可以存储数据. 这能减少查询的时间. 但是想象一下,如果我们需要在B树中查找一段数据,那该怎么查找? 或者说我们直接想按照一定顺序遍历所有值,那该怎么办? 这个时候就比较麻烦了. 如果我们想做区间查找,那么我们需要对初始节点到末节点之间做中序遍历. 遍历所有值也需要进行中序遍历,涉及到大量的计算和IO. 这时候B树的性能就不是十分优越了. 所以我们引入了B+树.它的特点就是, 树的非叶子节点部分只起索引作用,所有键值均存储在最下面的叶子节点中(还记得B树的一条定义是叶子节点都在同一层吗?) 并且叶子节点之间依次用指针相连接,组成一个链表. 这样做就可以缓解区间查询和遍历的问题. 如果我们想在B+树上进行区间查询,我们只需要标记开始点和终止点,然后在链表上遍历即可. 遍历同理. 由于这种特性, B+树被广泛地用于数据库存储引擎中.