InnoDB数据结构和算法(读MySQL技术内幕-InnoDB存储引擎)

InnoDB支持的常用的索引:B+树索引,全文索引,哈希索引

 

B+树是从平衡二叉树演化而来,却不是二叉树

https://www.cnblogs.com/yichengming/p/11176741.html

B+树索引找到的并不是一个给定键值的具体行,而是被查找数据所在的页,将页读入到内存,再从内存中查找需要的数据

 

二分查找法(折半查找法):每次取中心点做比较

上图中:顺序查找平均次数:(1+2+3+4+5+6+7+8+9+10)/10 = 5.5次

              二分查找平均次数:(4+3+2+4+3+1+4+3+2+3)/10 = 2.9次

 

二叉查找树:

左子树的键值总是小于根的键值,右子树的键值总是大于根的键值

上图中:二叉查找树的查找平均次数为:(3+3+3+3+4+1)/6 = 2.3 次

               顺序查找的查找平均次数为:(1+2+3+4+5+6)/6 = 3/3次

 

平衡二叉树:

符合二叉树的的定义,且任何节点的俩个子树的高度最大差为1

子树的高度:就是指最大的深度

但是维护平衡性需要多次左旋或者右旋:

 

B+树:

是为磁盘或其他直接存取辅助设备(对应之前说的查找的是具体数据所在的页,再放入内存)设计的一种平衡查找树

所有记录节点都是按照键值大小顺序放在同一层的叶子节点上,由各叶子节点指针连接

扇出(fan out):是指该模块可直接调用的下级模块的个数

扇入(fan in):是指直接调用该模块的上级模块的个数

B+树的插入操作:

demo:

初始的B+树为图5-6

现在插入28这个键值,则为:

再插入70:

再插入95(95是需要插入90之后的),服务上面第三种情况:

B+树作用于磁盘(再次申明了),所以拆分意味着磁盘的操作,应减少,所以提供了类似于二叉树的旋转(Rotation)功能

上图5-7再插入70时,不会进行拆分index page 操作,而是先进行旋转(一般左兄弟会先检查是否需要旋转),成下图(具体旋转过程不是很懂

 

B+树的删除操作:

使用填充因子(fill factor)来控制树的变化,50%是填充因子可设的最小值。B+树删除后依然需要保证删除后的叶子节点记录排序,所以也有三种情况。

填充因子:使用现有数据创建新索引时将每页填满到什么程度。由于在页填充时 mySql 必须花时间来拆分页,因此填充因子会影响性能(就是说上面图中每页的数据不是一定要填满的,填充因子小,就是不填满,数据分散开,占更多的存储空间,但是空位置多,不需要频繁的做拆分等操作,即I/O操作少,性能高。填充因子大则反之)

下面的例子均以填充因子为50%作为标准:(比较的是删除后

5-9图做删除操作,删除70这条记录,得下图:

 

再删除键值为25的记录:

再删除键值60:

第二部后结果:

最后的结果(不懂):

感觉是书上画错了,因为前面B+树的插入操作时,明确说明了大于或等于中间节点的是放在右边的(下图80是放在左边的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值