B+树是如何进行插入和删除操作的?

一、B+树的插入操作

B+树的插入操作必须保证插入后的叶子节点中的记录依然是排序的。同时需要考虑插入到B+树的三种情况,每种情况都可能会导致不同的插入算法。

以下面的这个列子来分析B+树的插入过程。

插入28

对于上面这颗B+树,当要插入28时,由于LeafPage和IndexPage都没有满,所以直接进行插入,插入后的图如下所示。 

拆分

插入70

接着插入70,此时由于原先的LeafPage已经满了,但是IndexPage没有满,如何表中的第2种情况,这时插入LeafPage后的情况为50、55、60、65、70,并根据中间值60来拆分叶子节点,拆分后的图如下。

插入95

接着插入95,这符合表中的第3种情况,即LeafPage和IndexPage都满了,这时要进行两次拆分,第一次拆分LeafPage,第二次拆分IndexPage。拆分过程如下。

无论怎么插入,B+树都能保持平衡。但是为了平衡,新插入键值时可能要做大量的拆分页(split)操作。因为B+树结构主要用于磁盘,页的拆分意味着磁盘的操作,总所周知磁盘操作效率是非常低的,所以应该尽量减少页的拆分操作。因此,B+树同样提供了类似平衡二叉树的旋转(Rotation)操作。

旋转

旋转发生在Leaf Page已经满,但其左右兄弟节点没有满的情况下。这时B+树并不会急于去做拆分页的操作,而是将记录移到所在页的兄弟节点上。在通常情况下,左兄弟节点会被首先用来检查做旋转操作。现在再来看前面插入70的情况,此时B+树并不急于去拆分叶子节点,而是去做旋转操作,过程如下图所示。

可以看到,采用旋转操作的B+树减少了一次拆分页的操作,同时这颗树的高度仍然为2。

二、B+树的删除操作

B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因此可以设置的最小值。B+树的删除操作同样要保证删除后的节点中的记录依然排序。B+树的删除操作同样需要考虑以下三种情况。与插入不同的是,删除根据填充因子的变化来衡量。

 

posted @ 2019-03-12 16:30  静水楼台/Java部落阁  阅读(468)  评论(0编辑  收藏  举报