B+树的研究

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/it_manman/article/details/82345894

B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。

首先,上一篇我们已经研究了B树的优点可以减少io,然后对比b树,B+树到底好在哪里呢 ?

由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引,而B树则常用于文件索引。
对比B树和B+树

image

区别有以下两点

1、 B+树中只有叶子节点会带有指向数据记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。

  1. B+树中所有叶子节点都是通过指针连接在一起,而B树不会。
    可以看到B+树后面是有顺序的

B+树的优点:

  1. 非叶子节点不会带上ROWID,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。

  2. 叶子节点之间通过指针来连接,范围扫描将十分简单,而对于B树来说,则需要在叶子节点和内部节点不停的往返移动
    B树的优点:
    对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。

接下来们来实现B+树的插入删除操作:
B+树的插入操作
我们建一个5阶的树
a)空树
image

b)依次插入8,10,15
image

c)插入16
插入16后超过了关键字的个数限制,所以要进行分裂。在叶子结点分裂时,分裂出来的左结点2个记录,右边3个记录,中间key成为索引结点中的key,分裂后当前结点指向了父结点(根结点)。
结果如下图所示
image
当然我们还有另一种分裂方式,给左结点3个记录,右结点2个记录,此时索引结点中的key就变为15。

d)插入17
image

e)插入18,插入后如下图所示
image
f)插入若干数据后
image

g)在上图中插入7,结果如下图所示image
当前结点的关键字个数超过4,需要分裂。左结点2个记录,右结点3个记录。分裂后关键字7进入到父结点中,将当前结点的指针指向父结点,结果如下图所示。

image

当前结点的关键字个数超过4,需要继续分裂。左结点2个关键字,右结点2个关键字,关键字16进入到父结点中,将当前结点指向父结点,结果如下图所示。image

参考文章:
https://www.sohu.com/a/156886901_479559
https://www.cnblogs.com/nullzx/p/8729425.html

B+树有一个特点:只有叶子节点带有卫星数据。其实就是索引地址。B+树查询的时候因为中间节点没有卫星数据,同样大小的磁盘页可以容纳更多的节点元素。意味着数据量相同的情况下,B+树会比B树更加的矮胖。
综合起来1、io次数更少2、查询性能稳定3、范围查询简便。

猜你喜欢

转载自blog.csdn.net/it_manman/article/details/82345894