一、MySQL Index 的插入

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

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

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

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

1、Leaf Page和Index Page都没满

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

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

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

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

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放在右边。

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

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

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

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

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

二、MySQL Index 的删除

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

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

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

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

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

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

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

三、一些概念

1、索引扇出

扇出:是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,需要控制和协调过多的下级模块;但扇出过小(例如总是1)也不好。
扇出过大一般是因为缺乏中间层次,应该适当增加中间层次的模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。

2、索引填充因子

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

MySQL B+树 的插入与删除的更多相关文章

  1. B树和B+树的插入、删除图文详解

    简介:本文主要介绍了B树和B+树的插入.删除操作.写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下 ...

  2. B树和B+树的插入、删除图文详解(good)

    B树和B+树的插入.删除图文详解 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数 ...

  3. B+树的插入、删除(附源代码)

    B+ Tree Index B+树的插入 B+树的删除 完整测试代码 Basic B+树和B树类似(有关B树:http://www.cnblogs.com/YuNanlong/p/6354029.ht ...

  4. AVL树的插入与删除

    AVL 树要在插入和删除结点后保持平衡,旋转操作必不可少.关键是理解什么时候应该左旋.右旋和双旋.在Youtube上看到一位老师的视频对这个概念讲解得非常清楚,再结合算法书和网络的博文,记录如下. 1 ...

  5. AVL 树的插入、删除、旋转归纳

    参考链接: http://blog.csdn.net/gabriel1026/article/details/6311339   1126号注:先前有一个概念搞混了: 节点的深度 Depth 是指从根 ...

  6. 转:B树和B+树的插入、删除图文详解

    如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了 ...

  7. AVL树的插入和删除

    一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...

  8. trie树---(插入、删除、查询字符串)

    HDU   5687 Problem Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:  1.insert : 往神奇字典中插入一个单词  2.delete: 在神奇字 ...

  9. MySQL 向表中插入、删除数据

    一.向表中插入一条信息 1.查看表中的数据 mysql> SELECT * FROM user; +----+---------+----------+ | id | account | pas ...

随机推荐

  1. 强类型c语言 类型

    C 语言是一门强类型的语言,类型决定语言的特性,允许在相同类型进行运算. *强类型语言的特点:      1      先声明,后使用. 2      类型不可变. * 基本数据类型 * 数据类型的范 ...

  2. Optional 理解

    目录 Optional 理解 1. 含义 2. Optional 类中方法 3. Optional 对象不应该作为方法参数 Optional 理解 1. 含义 Optional 是一个容器对象,该容器 ...

  3. poj 3617 弱鸡贪心

    比赛的时候扣了一道贪心的题目,不会写,,现在补一补一些基础的贪心. 题意:给定一个字符串s,要求按下列操作生成一个新串t--每次从s串中的最前和最后取一个字符给t,要求生成的t字典序最小. 题解:由于 ...

  4. 线段树 面积并问题 hdu 1255 1542

    重点整理面积并的思想 以及PushUp的及时更新 还有就是cover的实现 以及建树每个节点存的信息(每个节点存的是一个线段的信息) http://www.tuicool.com/articles/6 ...

  5. (三)ActiveMQ之发布- 订阅消息模式实现

    一.概念 发布者/订阅者模型支持向一个特定的消息主题发布消息.0或多个订阅者可能对接收来自特定消息主题的消息感兴趣.在这种模型下,发布者和订阅者彼此不知道对方.这种模式好比是匿名公告板.这种模式被概括 ...

  6. redis5.0集群配置

    介绍 redis自3.0版本以来支持主从模式的集群,可用哨兵监控集群健康状态,但这种方式的集群很不成熟,数据备份需要全量拷贝.在之后的版本才真正支持集群分片. 在redis5.0中去除了以redis- ...

  7. VBA连接操作符

    VBA支持以下连接运算符. 假设变量A=5,变量B=10,则 - 运算符 描述 示例 + 将两个值添加为变量,其值是数字 A + B = 15 & 连接两个值 A & B = 510 ...

  8. java序列化和反序列化使用总结

    一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输 ...

  9. Vue.js面试题整理(转载)

    一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...

  10. 《python解释器源码剖析》第13章--python虚拟机中的类机制

    13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象 ...