zoukankan      html  css  js  c++  java
  • 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+树的删除操作同样需要考虑以下三种情况。与插入不同的是,删除根据填充因子的变化来衡量。

    不积跬步,无以至千里。不积小流,无以成江海!
  • 相关阅读:
    zbb20190605 maven windows配置maven私服以及使用
    zbb20190528 城市经纬度json
    zbb20190528 adcode 城市编码
    zbb20190430 springboot 配置alimq
    zbb20190408 spring-boot-maven-plugin 插件的作用详解
    zbb20190131 Mybatis,mysql映射文件<!CDATA[[]]> 转义问题
    Spring Boot (29) 定时任务
    Spring Boot (28) actuator与spring-boot-admin
    Spring Boot (27) actuator服务监控与管理
    Java 8
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/10517625.html
Copyright © 2011-2022 走看看