B+树是B树的变体,也是一种多路搜索树
1.非叶子节点的子树指针与关键字个数相同;
2.为所有叶子节点增加一个链指针;
3.所有关键字都在叶子节点出现;
B+树插入新元素时,可能会遇到3种情况
Leaf page full | Index page full | 操作 |
NO | NO | 直接将记录插入叶节点 |
YES | NO | 1. 拆分leaf page 2. 将中间节点放入index page中 3. 小于中间节点的记录放在左边 4. 大于等于中间节点的记录放在右边 |
Yes | Yes | 1. 拆分leaf Page 2. 小于中间节点的记录放在左边 3. 大于等于中间节点放在记录右边 4. 拆分index Page 5. 小于中间节点的记录放在左边 6. 大于中间节点的记录放在右边 7. 中间节点放在上一层 index page |
下面演示B+树结构,高度为2,每页可存放4条记录
1)插入28满足第一种情况leaf page和index page都没满直接插入即可(B+树插入保证插入后叶节点的记录依然是顺序的)
2)插入70满足第二种情况,leaf page已满,index page还没满,50,55,60,65,70的中间值为60由于每页最多放4条记录需要拆分leaf page(双向链表一直存在没画出)
插入95 满足第三种情况75,80,85,90,95中间值是85放在index page(已满)60位index page的中间值放在上层index page这样一层index变成了60第二层index page变成了
25,50,75,85插入95后如下图
B+树的删除操作
B+树使用填充因子来控制数的删除变化。填充因子可以设置的最小值为50%。B+树的删除操作同样保证删除后叶节点的记录依然排序。
根据填充因子的变化,B+树删除操作也分为3种情况
Leaf Page Below Fill Factor | Index Page Below Fill Factor | 操作 |
NO | NO | 直接将记录从叶节点删除,如果该节点还是Index Page的节点,则用该节点的右节点代替 |
Yes | NO | 合并叶节点及其节点,同时更新Index Page |
Yes | Yes | 1. 合并叶节点及其兄弟节点 2. 更新Index Page 3. 合并Index Page及其兄弟节点 |
删除70符合第一种情况
删除25后和上面一样不同的是该值还是index page中的值。因此在删除Leaf Page中的25后,还需要将25的右兄弟节点28更新到Index Page中
删除Leaf page键值为60的记录后,其填充因子小于50%。需要做合并操作。同样在删除Index page中相关记录后需要做Index Page的合并操作