关于B+树的一点理解

B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了结点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率比B树更高、更稳定呢?让我们先来看看一个m阶的B树具有一些什么特征:

  1. 根节点至少有两个子节点(即根结点至少要有一个关键字)。
  2. 每个中间结点都包含k-1个关键字和k个子节点,其中m/2 ≤ \leq k ≤ \leq m。
  3. 每一个叶子结点都包含k-1个元素,其中m/2 ≤ \leq k ≤ \leq m(即叶子结点没有子结点)。
  4. 所有的叶子结点都位于同一层。
  5. 每个结点中的关键字都从小到大排列,结点当中k-1个元素正好是k个孩子包含的关键字的值域分划。

如下所示,是一个典型的B树结构:
B树
B+树和B树有一些共同点,但是B+树也具备一些新的特性。

一个m阶的B+树具有如下几个特征:

  1. 有k个子树的中间结点包含有k个元素(B树种是k-1个元素),每个元素不保存附加数据,只用来索引,所有数据都保存在叶子结点。
  2. 所有的叶子结点中包含了全部附加数据或者包含了指向附加数据的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的中间结点关键字都同时存在于子结点中,在子结点关键字中是最大(或者最小)的关键字。

如下所示,是一个典型的B+树结构:
B+树
从上图可以看出,根结点关键字8是子结点2,5,8的最大关键字,也是叶子结点6,8的最大关键字。根结点关键字15是子结点11,15的最大元素,也是叶子结点13,15的最大元素。
B+树描述
需要注意的是,根结点的最大关键字(如上图所示是15),也就等同于整个B+树的最大关键字。以后无论插入删除多少元素,始终保持最大元素在根结点中。对于叶子结点,由于父结点的关键字都出现在子结点,因此所有的叶子结点包含了全量关键字信息。并且每一个叶子结点都带有一个指向下一个结点的指针,形成了一个有序链表。
B+树叶子结点有序链表
另外,B+树还有一个特点,整个特点是在索引之外一个至关重要的特点。那也就是卫星数据(也叫附加数据)的位置。所谓卫星数据,值得是索引关键字所指向的数据记录,比如数据库中的某一行,在B+树种,无论是中间结点还是叶子结点都带有卫星数据。
B树种的卫星数据:
B树卫星数据
而在B+树当中,只有叶子结点带有卫星数据,其余中间结点仅仅是索引,没有任何数据关联。B+树种的卫星数据如下所示:
B+树卫星数据
另外,需要注意的是,在数据库中,聚集索引(Clustered Index)中,叶子结点世界包含卫星数据。在非聚集索引(NonClustered Index)中,叶子结点带有指向卫星数据的指针。
B+树这样设计的好处主要体现在查询性能上。下面我们分别通过单行查询和范围查询来做分析。
在单关键字查询的时候,B+树自顶向下逐层查找结点,最终找到匹配的叶子结点。比如我们要查找的是关键字3。
第一次磁盘I/O:
第一次磁盘IO
第二次磁盘I/O:
第二次磁盘IO
第三次磁盘I/O:
第三次磁盘IO
整个查找过程看起来和B树雷同,但其实有两点不同。

  • B+树的中间结点没有卫星数据,所以同样大小的磁盘页面可以容纳更多的结点关键字。也就是说数据量相同的情况下,B+树比B树更加“矮胖”,因此查询时IO次数更少。
  • B+树的查询必须最终查找到叶子结点,而B树只要找到匹配关键字即可,无论匹配关键字处于中间结点还是叶子结点。因此,B树的查找性能并不稳定(最好的情况是只查根结点,最坏情况是查到叶子结点)。而B+树的每一次查找都是稳定的。

下面我们再来看看范围查询。B树如何做范围查询呢?只能依靠繁琐的中序遍历。比如我们要查询范围为3到11的元素。
先自顶而下查找范围的下限关键字3:
B树范围查找
然后中序遍历到关键字6:
中序遍历关键字6
再中序遍历到关键字8:
中序遍历关键字8
然后中序遍历到关键字9:
中序遍历到关键字9
最后中序遍历到关键字11,完成整个范围查找过程:
中序遍历关键字11
我们来看看B+树结构如何做范围查找的。
还是自顶而下,查找到范围的下限关键字3:
B+树范围查找
然后通过链表指针,遍历到关键字6,8:
B+树遍历到关键字6,8
再通过链表指针,遍历到元素9,11,结束整个遍历过程:
B+树遍历到关键字9,11
可以看出,B+树的范围查找比B树范围查找简单的多。

相对B树来说,B+树具有如下优点:

  • 单一节点存储更多的关键字,使得查询的IO次数更少。
  • 所有查询多要查找到叶子结点,查询性能稳定。
  • 所有叶子结点形成有序链表,便于范围查询。

参考:
漫画算法:什么是 B+ 树?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值