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+树的例子
在上面这棵树中,可以看到每一个父节点的元素都出现在子节点中,是子节点最大或最小元素
根节点元素8是子节点2,5,8的最大元素,也是叶子节点6,8的最大元素
根节点元素15是子节点11,15,8的最大元素,也是叶子节点13,15的最大元素
而且叶子节点用指针连接在一起
只有叶子节点有数据,非叶子节点都是索引。当然这指的是聚集索引,非聚集索引叶子节点包含的不是数据,而是指向数据的指针
为什么要这样设计呢,从两个维度来分析:
1,单元素查询
单元素查询的时候,B+树会自顶向下逐层查找节点,最终找到匹配的叶子节点,比如我们要找的是元素3
第一次磁盘IO:
第二次磁盘IO:
第三次磁盘IO:
比一般的树io次数少
2,范围查询
范围查询就优势更大了,一般的树查询,需要频繁的中序遍历,而b+树只要遍历链表
B+树的范围查找过程
自顶向下,查找到范围的下限(3):
通过链表指针,遍历到元素6, 8:
通过链表指针,遍历到元素9, 11,遍历结束:
总结
B+树的优势:
1.单一节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.所有叶子节点形成有序链表,便于范围查询。