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*1024 | 8 | 2048~ |
这只是一个大概的估算,只能做参考,辅助理解
一个节点可以保存2048个关键字,2049路
多路平衡树的优势
- 单个节点存储的数据量大
- 树的深度低
mysql B+Tree
- 节点关键字搜索采用左闭合
- 对索引中的关键字进行计算(对比),一定是从左往右依次进行,且不可跳过
- 所有的数据都保存在叶子节点
- 支节点只保存关键字和子节点引用,不再保存数据区
- 叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
B+Tree优点
- B+树是B-树的变种多路绝对平衡树,拥有B-树的优势
- B+树扫库、表能力更强,因为左闭合扫描到叶子节点之后可以一直在叶子节点中搜索,因为叶子节点的相邻节点具有顺序引用的关系
- B+树的磁盘读写能力更强,支节点不保存数据区,保存的关键字更多
- B+树的排序能力更强
- B+树的查询效率更加稳定(大数据量,大部分情况下)