定义
M阶B+树定义:
tip : M阶非叶子节点儿子至多M个,即节点中关键字key最多M-1个
M与L取值问题
每个节点代表一个磁盘区块,假设一个磁盘区块存4096字节数据,因此根据存储项的大小选择M和L.
先有一user表,id为主键索引16个字节,一条记录record 32字节,指向下一个节点的指针next为2字节,先根据id建立索引.
那么一个节点中最多存的id个数为M-1:
即一个节点最多228个儿子,最少114个儿子.一个节点中最多227最少113个id.
一个节点总最多存放的记录record 为L个:
即一个节点中最多存128条,最少64条记录.
对于6.4亿条数据,最多1000万个叶子节点,最少500万个
下面举例为5阶B+树,M为5与L为4
插入操作
1. 若为空树,创建一个叶子节点,然后将记录插入其中,此时这个叶子节点也是根节点,插入操作结束.
2. 根据key找到叶子节点,向这个叶子节点插入记录.插入后若叶子节点key小于等于m-1,插入结束;否则以中间key进行分裂,并将key进位到父节点.如果父节点key个数小于等于m-1结束操作.否则下一步
3. 再以中间key进行分裂,并将key进位到父节点,最差的情况一直回溯到根节点分裂,树高度+1.
举例5阶B+树的插入
带蓝色的节点为叶子节点,其中叶子节点带值,非叶子节点只有key为索引节点
根据定义5阶B树一个节点中最多4个key,最少2个key.
1. 插入50,55,60,65
2. 插入70
3. 插入35,40,45,75,80
4. 插入56,57,85,90
5. 插入41,42,51,52,58,66,67.76.77.91
6. 插入43,53,59,68,78,92,93,94
删除操作
删除的值一定在叶子节点中!
1. 如果删除后叶子节点中的key数量大于等于Math.ceil(m/2)-1,
则结束操作.否则进行下一步
2. 如果删除后叶子节点的key数量小于Math.ceil(m/2)-1,
**如果**兄弟节点的数量大于Math.ceil(m/2)-1,那么可
以向兄弟节点借一个key,并更新父节点中对应的索引值.结束
操作. **否则**进行下一步
3. 合并兄弟节点删除父key.如果父索引节点中key个数大于
等于Math.ceil(m/2)-1,那么结束操作.否则进行下一步
4. 如果索引节点A的兄弟节点个数大于Math.ceil(m/2)-1,
那么可以向祖父节点借一个key,祖父节点再向索引节点A的兄
弟节点借一个key.即以祖父key为根节点进行旋转,否则进行
下一步
5. 合并索引节点的兄弟节点.
举例5阶B+树的删除
5阶B+树
1.删除50.
2.删除42.由于兄弟节点中key的数量都为2,因此合并兄弟节点(35,40)
合并后索引节点中key的数量为1,不满足条件,且索引节点的兄弟节点中的key数量为2,因此合并索引节点的兄弟节点
合并索引节点后
3.删除60. 60位于索引节点上,
因此先找到60的后继key为65替换60,
再删除叶子节点上的60.
4.删除68,兄弟节点key个数均为2,因此合并兄弟节点
合并后,父索引节点中的key数量为1.不满足条件.而父索引节点的兄弟节点中的key大于2,因此可以选择向祖父索引节点借key,祖父节点向父索引节点的兄弟节点借key.即以76为根进行左旋操作
旋转后: