B+树

B+树是基于B-树的一种变体,有着比B-树更高的查询性能。
一个m阶的B+树具有如下几个特征:

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


    5.png

    首先,每一个父节点的元素都出现在子节点中,是子节点的最大(或最小)元素。


    6.png

    在上面这棵树中,根节点元素8是子节点2,5,8的最大元素,也是叶子节点6,8的最大元素。
    根节点元素15是子节点11,15的最大元素,也是叶子节点13,15的最大元素。
    根节点的最大元素(这里是15),也就等同于整个B+树的最大元素。以后无论插入删除多少元素,始终要保持最大元素在根节点当中。

    至于叶子节点,由于父节点的元素都出现在子节点,因此所有叶子节点包含了全量元素信息。
    并且每一个叶子节点都带有指向下一个节点的指针,形成了一个有序链表。


    7.png

    B+树还具有一个特点,这个特点是在索引之外,确实至关重要的特点。那就是【卫星数据】的位置
    所谓卫星数据,指的是索引元素所指向的数据记录,比如数据库中的某一行。在B-树中,无论中间节点还是叶子节点都带有卫星数据。
    B-树中的卫星数据
    8.png

    而在B+树当中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。
    B+树中的卫星数据
    9.png

    需要补充的是,在数据库的聚集索引中,叶子节点直接包含卫星数据。在非聚集索引中,叶子节点带有指向卫星数据的指针。
    B+树的好处主要体现在查询性能上。下面我们分别通过单行查询和范围查询来做分析。

    在单元素查询的时候,B+树会自顶向下逐层查找节点,最终找到匹配的叶子节点。比如我们要查找的是元素3.
    第一次磁盘IO:


    1.png

    第二次磁盘IO
    2.png

    第三次磁盘IO
    3.png

    B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。这就意味着,数据量相同的情况下,B+树的结构比B-树更加“矮胖”,因此查询时IO次数也更少。其次,B+树的查询必须最终查找到叶子节点,而B-树只要找到匹配元素即可,无论匹配元素处于中间节点还是叶子节点。因此,B-树的查找性能并不稳定(最好情况是只查根节点,最坏情况是查到叶子节点)。而B+树的每一次查找都是稳定的。
    对于范围查找,B-树如何做到范围查询呢?只能依靠繁琐的中序遍历。比如我们要查询范围为3到11的元素:
    B-树的氛围查找过程
    自顶向下,查找到范围的下限(3):
    4.png

    中序遍历到元素6
    5.png

    中序遍历到元素8
    6.png

    中序遍历到元素9
    7.png

中序遍历到元素11,遍历结束


8.png

B-树的范围查询确实很繁琐
反观B+树的范围查询,则要简单得多,只需要在链表上做遍历即可:
B+树的范围查找过程
自顶向下,查找的范围的下限(3):


9.png

通过链表指针,遍历到元素6,8


10.png

通过链表指针,遍历到元素9,11,遍历结束:
1.png

综合起来,B+树相比B-树的优势有三个:1. IO次数更少;2. 查询性能稳定。3. 范围查询简便

B+树的优势:
  1. 单一节点存储更多的元素,使得查询的IO次数更少。
  2. 所有查询都要查找到叶子节点,查询性能稳定。
  3. 所有叶子节点形成有序链表,便于范围查询
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,470评论 0 25
  • 原文链接 B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(...
    非典型程序员阅读 1,214评论 0 3
  • B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balan...
    铁甲依然在_978f阅读 1,472评论 0 4
  • B-树,就是B树,B树的原英文名是B-tree,所以很多翻译为B-树,就会很多人误以为B-树是一种树、B树是另外一...
    xx1994阅读 23,914评论 1 17
  • 前面两章介绍了一下倒排索引以及倒排索引字典的两种存储结构,分别是跳跃表和哈希表,本篇我们介绍另一种数据结构,他也被...
    吴YH坚阅读 2,515评论 0 4