什么是B+树?[转]

目录

1 B树与B+树的区别

2 B+树的特点

父子节点关系

叶子成链

卫星数据

3 B+树的好处

IO过程少

查询稳定

便于范围查找

4 总结

B+树的特征

B+树的优势


1 B树与B+树的区别

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

  1. 根结点至少有两个子女。
  2. 每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
  3. 每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
  4. 所有的叶子结点都位于同一层。
  5. 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

 

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

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

如下图就是一个B+树:

什么是B+树?[转]_第1张图片

 

2 B+树的特点

父子节点关系

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

例如:上图这棵树中,根节点元素 8 是子节点 2, 5, 8 的最大元素,也是叶子节点 6, 8 的最大元素。根节点 15 是子节点 11, 15 的最大元素,也是叶子节点 13, 15 的最大元素。

注意:根节点的最大元素(这里是15),也就等同于整个B+树的最大元素。以后无论插入删除多少元素,始终要保持最大元素在根节点当中。

什么是B+树?[转]_第2张图片

 

叶子成链

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

什么是B+树?[转]_第3张图片

 

卫星数据

卫星数据,指的是索引元素所指向的数据记录,比如数据库中的某一行。在B-树中,无论中间节点还是叶子节点都带有卫星数据。而在B+树当中,只有叶子节点带有卫星数据,其余中间节点仅仅是索引,没有任何数据关联。

什么是B+树?[转]_第4张图片

什么是B+树?[转]_第5张图片

需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

 

3 B+树的好处

IO过程少

在单元素查询的时候,B+树会自顶向下逐层查找节点,最终找到匹配的叶子节点。

比如我们要查找的是元素3,其磁盘IO过程如下:

什么是B+树?[转]_第6张图片

什么是B+树?[转]_第7张图片

什么是B+树?[转]_第8张图片

与B树相比,B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。这也就意味着,数据量相同的情况下,B+树的结构比B-数更加 “矮胖” ,因此查询时 IO 次数也更少。

 

查询稳定

B+树的查询必须最终查找到叶子节点,而B树只要找到匹配元素即可,无论匹配元素处于中间节点还是叶子节点。因此,B-树的查找性能并不稳定(最好情况下是只查根节点,最坏情况是查到叶子节点)。而B+树的每一次查找都是稳定的。

 

便于范围查找

B+树的范围查找过程:

什么是B+树?[转]_第9张图片

什么是B+树?[转]_第10张图片

什么是B+树?[转]_第11张图片

 

 

4 总结

B+树的特征

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

 

B+树的优势

  1. 单一节点存储更多的元素,使得查询的IO次数更少
  2. 所有查询都要查找到叶子节点,查询性能稳定
  3. 所有叶子节点形成有序链表,便于范围查询

 

你可能感兴趣的:(Java,学习)