mysql B+Tree

MySql

系列文章

索引是什么?

索引是为了加速对表数据行的查询(检索)而创建的一种分散存储的数据结构
在这里插入图片描述

  • 索引能极大的减少存储引擎需要扫描的数据量
  • 索引可以把随机IO变成顺序IO
  • 索引可以帮助我们再进行分组、排序等操作时,避免使用临时表

平衡二叉树

AVL树就是平衡二叉树,包括红黑树也是平衡二叉树的一种
在这里插入图片描述

这里可以看之前写的两篇文章

mysql中索引使用的是B+Tree

不选择平衡二叉树的原因

  • 太深了
    • 每个节点存储一个关键字,两条路导致树的深度会比较深

数据的深度决定这IO操作次数,IO操作耗时长

  • 太小
    • 每个节点存储一个关键字,存储的信息比较少

每一个磁盘块(节点/页)保存的数据量小

没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘的IO预读功能(空间局部性原理),从而带来频繁的IO操作

绝对平衡树B-Tree

在这里插入图片描述

  • 每个节点如果存储两个关键字,每个节点可以保存更多的数据
  • 三条路保证树深度的减少,路数越多,树的深度越小

如何来维持树的平衡

  • 和AVL树或者红黑树不一样,不是通过旋转来完成

  • 如果新增或者删除导致树的平衡发生变化,会通过节点的合并或者拆分,让树再次达到平衡

可以通过这个网站进行模拟
B-Tree模拟网站
Max. Degree = 3 表示3路

多路平衡查找树

mysql一次IO默认16k数据

比如定义一个int型的字段(4Byte)

一个单位的大小=一个int(4Byte) +子引用的大小(假设4Byte)

mysql一次IO的大小 = 16*1024Byte

mysql一次IO的大小(byte)一个单位大小(byte)存储关键字的数量
16*102482048~

这只是一个大概的估算,只能做参考,辅助理解

一个节点可以保存2048个关键字,2049路

多路平衡树的优势

  • 单个节点存储的数据量大
  • 树的深度低

mysql B+Tree

[外链图片转存失败(img-y2qtKzKr-1566182821552)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1566129844980.png)]

  • 节点关键字搜索采用左闭合
    • 对索引中的关键字进行计算(对比),一定是从左往右依次进行,且不可跳过
  • 所有的数据都保存在叶子节点
  • 支节点只保存关键字和子节点引用,不再保存数据区
  • 叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系

B+Tree优点

  • B+树是B-树的变种多路绝对平衡树,拥有B-树的优势
  • B+树扫库、表能力更强,因为左闭合扫描到叶子节点之后可以一直在叶子节点中搜索,因为叶子节点的相邻节点具有顺序引用的关系
  • B+树的磁盘读写能力更强,支节点不保存数据区,保存的关键字更多
  • B+树的排序能力更强
  • B+树的查询效率更加稳定(大数据量,大部分情况下)

系列链接

下一篇:MySql Myisam和innodb对比 索引优化建议

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值