多路平衡查找树(B Tree)(分裂、合并)

Balanced Tree

这个就是我们的多路平衡查找树,叫做B Tree(B 代表平衡)

跟AVL 树一样,B 树在枝节点和叶子节点存储键值、数据地址、节点引用。

它有一个特点:分叉数(路数)永远比关键字数多1。比如我们画的这棵树,每个节点存储两个关键字,那么就会有三个指针指向三个子节点。

 B Tree 的查找规则是什么样的呢?

比如我们要在这张表里面查找15。

因为15 小于17,走左边。

因为15 大于12,走右边。

在磁盘块7 里面就找到了15,只用了3 次IO。

这个是不是比AVL 树效率更高呢?

那B Tree 又是怎么实现一个节点存储多个关键字,还保持平衡的呢?跟AVL 树有什么区别?

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

比如Max Degree(路数)是3 的时候,我们插入数据1、2、3,在插入3 的时候,本来应该在第一个磁盘块,但是如果一个节点有三个关键字的时候,意味着有4 个指针,子节点会变成4 路,所以这个时候必须进行分裂。把中间的数据2 提上去,把1 和3 变成2 的子节点。

如果删除节点,会有相反的合并的操作。

注意这里是分裂和合并,跟AVL 树的左旋和右旋是不一样的。

我们继续插入4 和5,B Tree 又会出现分裂和合并的操作。

从这个里面我们也能看到,在更新索引的时候会有大量的索引的结构的调整,所以解释了为什么我们不要在频繁更新的列上建索引,或者为什么不要更新主键。

节点的分裂和合并,其实就是InnoDB 页的分裂和合并。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值