mysql b 树 锁_MySQL B+树 的插入与删除

一、MySQL Index 的插入

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

并且是顺序存放,如果用户从最左边的叶子节点开始顺序遍历,可以得到所有简直的顺序

排序:5、10、15、20、25、30、50、55、60、65、75、80、85、90。

3f6d9c0a8a5eaa75a8092139391f7be1.png

B+树的插入操作,分为三种情况

b2693618e5750ef0ee4779cc8ca11646.png

1、Leaf Page和Index Page都没满

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

6e72f476668cdb7dc014f1a66c6cb6cf.png

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

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

这是插入Leaf Page后情况为50、55、60、65、70,并根据中间值60来拆分叶节点。

881a682032f584ebbd57743d5c0e6f0e.png

3、Leaf Page和Index Page都满了

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

1)首先插入Leaf Page后情况为75、80、85、90、95,由于Leaf Page已经满了,需要根据中间值85拆分叶节点,小于85的放左边即75、80;

大于等于85的放右边即85、90、95。

2)将中间节点85放入Index Page后,Index Page的值为25、50、60、75、85,由于Index Page也满了,需要拆分Index Page,取中间值60,

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

defa3224f98cd6d0e703879162ccde0c.png

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

不管怎么变化B+树总是保持平衡。但是为了保持平衡杜宇先插入的键值可能需要做大量的拆分操作。因为B+树结构主要用于磁盘,页的拆分意味着磁盘操作,所以应该在可能的情况下尽量减少页的拆分操作。因此,B+树同样提供了类似平衡二叉树的旋转(Rotation)功能。

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

39f03f6ae0afe370c2e54ddeb3328ed8.png

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

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

a468d50c324ae36420740c9df8ffd996.png

二、MySQL Index 的删除

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

a4931a7bf88539b49fc912d582765d63.png

1765ea742ca55fd94ff7fb19bdca83c8.png

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

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

30fa31d4c924e252da855b0584e59229.png

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

e280870325dfa046ab04a8051b77eb3b.png

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

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

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

92ca18ba8936903c766de25901a3f8a9.png

三、一些概念

1、索引扇出

扇出:是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,需要控制和协调过多的下级模块;但扇出过小(例如总是1)也不好。

扇出过大一般是因为缺乏中间层次,应该适当增加中间层次的模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。

2、索引填充因子

和索引重建最相关的是填充因子。当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量。填充因子设置为100意味着每个索引页100%填满,50%意味着每个索引页50%填满。

如果你创建一个填充因子为100的聚集索引(在一个非单调递增的列上),那意味着每当一个记录被插入(或修改)时,页拆分都会发生,因为在现存的页上没有这些数据的空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值