数据结构——5、树——3、B+树

1.1.1 *B+树*

1.1.1.1 *B+树实现细节是什么样?*

1.1.1.2 *B+树的特征*

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

1、 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2、 所有的叶子结点中包含了全部元素的信息,及指向这些元素的指针,且叶子结点本身依关键字的大小,自小而大顺序链接。

3、 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

示例:

img

可以看到:

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

由于父节点的元素都包含在了子节点中,因此所有叶子节点包含了全量元素信息

每一个叶子节点都带有指向下一个节点的指针,形成了一个有序链表

B+树有卫星数据,即索引元素所指向的数据记录,比如数据库中的某一行,

在B-树中,无论中间节点还是叶子节点,都带有卫星数据

B+树中,只有叶子节点带有卫星数据,其他中间节点仅仅是索引,没有任何数据关联

imgimg

在数据库的聚集索引中,叶子节点直接包含卫星数据,在非聚集索引中,叶子节点带有指向卫星数据的指针

1.1.1.3 *B+树的查询*

B+树的好处主要体现在查询性能上

1.1.1.3.1 *单行查询*

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

示例:查找元素3

imgimg

img

注意:B+树的查询看起来与B树差不多,但实际上有两点不同:

1、 B+树的中间节点没有卫星数据,所以,同样大小的磁盘页,B+树的磁盘页可以容纳更多的节点数据

即数据量相同的情况下,B+树的结构比B-树更加“矮胖”,因此,查询时,IO次数更少

2、 B+树的查询必须通过查找叶子节点,而B树只需要找到元素即可,无论匹配的元素是处于中间节点,还是叶子节点

因此,B树的查找性能不稳定,最好的情况是查找到根节点,最坏的情况是查找到叶子节点

而B+树的查找性能是稳定的,每一次都固定查找到叶子节点

1.1.1.3.2 *范围查询*

B+树的范围查询,要远远好于B树的范围查询

示例:查询3到11的元素

B树的查找过程:

需要依靠繁琐的中序遍历

imgimg

imgimg

img

B+树的查找过程:

只需要在叶子节点的链表上做遍历即可

imgimg

img

B+树相对于B树而言,优势有:

1、 IO次数更少;

2、 查询性能更稳定;

3、 范围查询简便;

1.1.1.4 *B-树与B+树的区别?*

B+树相对于B树的优势:

1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查找到叶子节点,查询性能稳定。

3.所有叶子节点形成有序链表,便于范围查询。

B+树是以空间换时间啊,因为子节点都包含父节点的元素。树的层数和一个节点被重复存储成线性关系

的确是以空间换时间。父节点元素在子节点重复出现,增加了少量空间,换来的是范围查询的便利。

那还要B-树有何用?

B-树的好处是,虽然查询性能不稳定,但平均的查询速度快一些(不用每次都查找到叶子节点为止)

为什么要强调B+树查询性能稳定呢?有特殊的应用场合么?

B+树的查询每次都查到叶子节点,所以IO次数稳定。试想一个数据库的查询,有时候执行10毫秒,有时候执行100毫秒,肯定是不太合适的。还不如每次都执行30毫秒

1.1.1.5 *联合索引在B+树中如何存储?*

简单的说,联合索引就是把多个索引值拼接成一个字符串A,字符串A像普通索引一样保存在索引树中。

posted on 2021-09-29 10:05  夜萤火虫和你  阅读(123)  评论(0编辑  收藏  举报

导航