B+树是B树的一种变形,在叶结点上存储信息。
- 所有的关键码均出现在叶结点。
- 各层节结中的关键码均是下一层相应节结中最大关键码(或最小关键码)的复写。
B+树的结构定义如下:
- 每个结点最多有m个子结点
- 每个结点(除根结点)至少有[m/2]个子结点
- 根结点至少有两个子结点
- 有k个子结点的结点必有k个关键码
和B树相似,B+树阶的大小是根据外存磁盘叶块大小及关键码域和相应的指针域所占用的空间大小计算得来,考虑到可维护性和空间效率,所以规定每个结点至少有[m/2]个子结点,保证在全满和半满之间。
B+树的查找
在上层已找到待查的关键码,并不停止,而是继续沿指针向下一直查到叶结点层的这个关键码。如图可以看出,B+树被广泛应用的外存索引的好处是,可以有效减少io次数,io次数和树高有关,而B+树可以很好的控制树的高度,从而达到最快的外存读写。
B+树的插入
插入过程与B树类似。注意保证上一层结点中有这两个结点的最大关键码(或最小关键码)。
插入位置如果没有益处,则找到相应的叶结点插入。如果有益处,则将进行分裂过程,该结点分裂成两个结点,而且在父层添加复写关键码,和指向新结点的指针。
B+树的删除
当关键码下益处时,与左或右兄弟进行调整(甚至合并)
关键码在叶结点层删除后,其在上层的复本可以保留,作为一个‘分界关键码’存在。也可以替换为新的最大关键码(或最小关键码)