一、引言
B+树是B树的一个变种,用于查询时有更高的性能,常用作于mySql等关系型数据库的索引进行使用,必须了解一波~
二、B+树
定义:B+树可以简单地看作n叉排序树
常见应用:关系型数据库索引,如mySql索引,和操作系统的文件系统中
优势:
- 由于卫星数据存在于叶子节点,所以中间节点可以存储更多的元素,使得查询的IO次数更少。
- 所有查询都要查找到叶子节点,查询性能稳定。
- 所有叶子节点形成有序链表,便于范围查询。
下面通过一个查找元素的例子来进行解析~
查找元素的流程:
上图是B+树查找元素的流程示例,也许第一次看会比较蛋疼,那我们先从它的几个特点说起:
m阶的B+树独有特征:
- 有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
- 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
解析:我们可以对着上面的原则进行解析,图中是一个3阶的B+树,那么m为3,m/2 <= k <= m则k可以取2,3。
- 如根节点,有k【2】个子树包含了k【2】个元素;又如中间节点有k【3】个子树包含了k【3】个元素
- 所有叶子节点包含了整棵树的所有元素信息,且依次从大到小排列,用指针相连
- 所有的中间节点元素都同时存在于子节点,且为其中的最大(或最小)元素,这在图中也能看出。
PS:根节点的最大元素【图中是15】等同于B+树的最大元素,以后无论插入/删除多少元素,始终要保证最大元素在根节点当中
PS:卫星数据:指的是索引元素所指向的数据记录
PS:B+数作为索引使用时,中间节点不保存数据,只做索引用,所有数据的定位指针【卫星数据】保存在叶子节点中。
PS:在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。