B+树和二叉树、平衡二叉树同样,都是经典的数据结构。B+树由B树和索引顺序访问方法(ISAM,是否是很熟悉?对,这也是MyISAM引擎最初参考的数据结构)演化而来,可是在实际使用过程当中几乎已经没有使用B树的状况了。算法
B+树的定义十分复杂,所以只简要地介绍B+树:B+树是为磁盘或其余直接存取辅助设备而设计的一种平衡查找树,在B+树中,全部记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行链接。数据结构
咱们先来看一个B+树,其高度为2,每页可存放4条记录,扇出(fan out)为5。spa
能够看出,全部记录都在叶节点中,而且是顺序存放的,若是咱们从最左边的叶节点开始顺序遍历,能够获得全部键值的顺序排序:五、十、1五、20、2五、30、50、5五、60、6五、7五、80、8五、90。设计
B+树的插入必须保证插入后叶节点中的记录依然排序,同时须要考虑插入B+树的三种状况,每种状况均可能会致使不一样的插入算法,如表5-1所示。 3d
咱们用实例来分析B+树的插入,咱们插入28这个键值,发现当前Leaf Page和Index Page都没有满,咱们直接插入就能够了。指针
此次咱们再插入一条70这个键值,这时原先的Leaf Page已经满了,可是Index Page尚未满,符合表5-1的第二种状况,这时插入Leaf Page后的状况为50、5五、60、6五、70。咱们根据中间的值60拆分叶节点。blog
由于图片显示的关系,此次我没有能在各叶节点加上双向链表指针。最后咱们来插入记录95,这时符合表5-1讨论的第三种状况,即Leaf Page和Index Page都满了,这时须要作两次拆分。排序
能够看到,无论怎么变化,B+树老是会保持平衡。可是为了保持平衡,对于新插入的键值可能须要作大量的拆分页(split)操做,而B+树主要用于磁盘,所以页的拆分意味着磁盘的操做,应该在可能的状况下尽可能减小页的拆分。所以,B+树提供了旋转(rotation)的功能。索引
旋转发生在Leaf Page已经满了、可是其左右兄弟节点没有满的状况下。这时B+树并不会急于去作拆分页的操做,而是将记录移到所在页的兄弟节点上。一般状况下,左兄弟被首先检查用来作旋转操做,这时咱们插入键值70,其实B+树并不会急于去拆分叶节点,而是作旋转,50,55,55旋转。图片
能够看到,采用旋转操做使B+树减小了一次页的拆分操做,而这时B+树的高度依然仍是2。
B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子可设的最小值。B+树的删除操做一样必须保证删除后叶节点中的记录依然排序,同插入同样,B+树的删除操做一样须要考虑如表5-2所示的三种状况,与插入不一样的是,删除根据填充因子的变化来衡量。
首先,删除键值为70的这条记录,该记录符合表5-2讨论的第一种状况,删除后。
接着咱们删除键值为25的记录,这也是表5-2讨论的第一种状况,可是该值仍是Index Page中的值,所以在删除Leaf Page中25的值后,还应将25的右兄弟节点的28更新到Page Index中,最后可获得图。
最后咱们来看删除键值为60的状况,删除Leaf Page中键值为60的记录后,填充因子小于50%,这时须要作合并操做,一样,在删除Index Page中相关记录后须要作Index Page的合并操做,最后获得图。