MySQL B+树 的插入与删除

1、MySQL Index 的插入

有以下B+树,其高度为2,每页可存放4条记录,扇出为5。全部记录都在叶子节点上,spa

而且是顺序存放,若是用户从最左边的叶子节点开始顺序遍历,能够获得全部简直的顺序3d

排序:五、十、1五、20、2五、30、50、5五、60、6五、7五、80、8五、90。blog

B+树的插入操做,分为三种状况

一、Leaf Page和Index Page都没满

用户插入28这个值,Leaf Page和Index Page都没满,直接插入便可排序

二、Leaf Page已经满了,Index Page没有满

用户插入70这个值,Leaf Page已经满了,Index Page没有满。继承

这是插入Leaf Page后状况为50、5五、60、6五、70,并根据中间值60来拆分叶节点。索引

三、Leaf Page和Index Page都满了

插入95这个值,Leaf Page和Index Page都满了,这是须要两次拆分io

1)首先插入Leaf Page后状况为7五、80、8五、90、95,因为Leaf Page已经满了,须要根据中间值85拆分叶节点,小于85的放左边即7五、80;class

大于等于85的放右边即8五、90、95。二叉树

2)将中间节点85放入Index Page后,Index Page的值为2五、50、60、7五、85,因为Index Page也满了,须要拆分Index Page,取中间值60,遍历

放入上层Index Page中,小于60的2五、50放在左边;大于60的值7五、85放在右边。

四、B+树的旋转(继承平衡二叉树的旋转功能)

无论怎么变化B+树老是保持平衡。可是为了保持平衡杜宇先插入的键值可能须要作大量的拆分操做。由于B+树结构主要用于磁盘,页的拆分意味着磁盘操做,因此应该在可能的状况下尽可能减小页的拆分操做。所以,B+树一样提供了相似平衡二叉树的旋转(Rotation)功能。

旋转发生在Leaf Page已满,其左右兄弟没满的状况下。B+树不急于作拆分,一般状况下左兄弟会被首先检查用来作旋转操做。

插入键值70,其实B+树并不会急于去拆分叶子节点,而是去作旋转操做,获得如图

采用旋转操做使得B+树减小了一次页的拆分操做,同时B+树的高度依然是2。

 

2、MySQL Index 的删除

 B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子能够设置的最小值。B+树的删除操做一样必须保证删除后叶子节点中的记录依然排序,同插入同样,B+树的删除操做一样有三种状况,与插入不一样的是,删除时根据填充因子的变化衡量。

一、叶子节点大于填充因子、中间节点大于填充因子

1)删除键值为70的这条记录,该记录符合第一种状况,删除后可得下图

 

2)接着5-11,再删除键值为25的记录,这也是讨论的第一种状况,可是该值是Index Page中的值,所以在删除Leaf Page中的25后,还应该将25的兄弟节点的28更新到Page Index中。

二、叶子节点小于填充因子、中间节点大于填充因子

三、叶子节点小于填充因子、中间节点小于填充因子

最后删除键值60的状况。删除Leaf Page中键值为60的记录后,Fill Factor小于50%,这时须要作合并操做,一样,再删除Index Page中相关记录后,须要作Index Page的合并操做,最后如图

 

3、一些概念

一、索引扇出

扇出:是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,须要控制和协调过多的下级模块;但扇出太小(例如老是1)也很差。
扇出过大通常是由于缺少中间层次,应该适当增长中间层次的模块。扇出过小时能够把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。

二、索引填充因子

和索引重建最相关的是填充因子。当建立一个新索引,或重建一个存在的索引时,你能够指定一个填充因子,它是在索引建立时索引里的数据页被填充的数量。填充因子设置为100意味着每一个索引页100%填满,50%意味着每一个索引页50%填满。若是你建立一个填充因子为100的汇集索引(在一个非单调递增的列上),那意味着每当一个记录被插入(或修改)时,页拆分都会发生,由于在现存的页上没有这些数据的空间。

相关文章
相关标签/搜索