MYSQL索引机制

索引的意义

索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构

工作机制

通过索引找到磁盘地址,再到硬盘中找到存储的数据内容
MYSQL索引机制_第1张图片

为什么选择B+树

binary search tree(二叉树)

MYSQL索引机制_第2张图片
二叉树查找采用了二分法的原则,大大缩减检索的效率,复杂度为log2n,但是可以注意到上图中的右子树是一个链表式,加入我们模拟一下这个情况,当数据不规范存储的时候,就会产生如下的一个名为二叉树实则链表的存储,在查询的时候并没有加速。相当于全表扫描,所以不采用二叉树结构存储
MYSQL索引机制_第3张图片

balance binary search tree (平衡二叉树)

所谓平衡二叉树,就是每个字节点的高度差不大于1.这个和二叉树有着比较大的差别,不会产生上图中的畸形情况。上图中的右子树的子节点的高度差为6。
MYSQL索引机制_第4张图片

平衡二叉树是如何维护自己的平衡

可以模拟插入一个9,先通过根节点进行比较MYSQL索引机制_第5张图片
比较之后查找right tree,他的右子树
MYSQL索引机制_第6张图片
以此类推,应该放到8的下面
MYSQL索引机制_第7张图片
这个时候可以看到高度差已经违反了平衡二叉树的定义,高度差为二。
为了保证这棵树的平衡,会用一系列逻辑保证平衡,此结构会进行左旋
MYSQL索引机制_第8张图片
所以通过以上机制,在频繁变更的列上尽量不要建立索引,没插入一个数据,就会消耗io等性能维护树的平衡。

为何不选择平衡二叉树作为mysql的查询机制

可以采用平衡二叉树模拟mysql的查询。数据的加载过程
保存了6个磁盘块,目前排列属于二叉树规则。我们现在搜索关键字8的数据,先将根节点10加载,10>8,查询左子树,通过P1子节点引用加载磁盘块2,关键字5和8进行比较,以此类推,找到磁盘块三,对比关键字,最终加载数据区,数据区可以保存具体的数据,也可以保存指向数据的字符
MYSQL索引机制_第9张图片
但是最终为何灭有采用平衡二叉树,存在一下缺点:
1 当树的深度比较深的时候,树的高度比较高时,增加io查询次数。会消耗io,io速度的比较慢,上图中数据的高度为三,消耗三次io,此棵树只能存储7个数据
2 在每次消耗的io时,只能对比一个关键字,并且每一个磁盘区(页/4KB)保存的数据量太少,没有很好的利用操作系统和磁盘数据交换特性,和磁盘预读能力。

balance tree (多路平衡查找树)

通过以上分析二叉树的缺陷,多路平衡查找树就完美解决了以上的缺陷
B树是一个绝对平衡树,多路指的是每个节点的子节点个数>2,目前3
多路平衡树是如何查找到的呢:首先我们查找28,拿到根节点,进行一个区间比对,17<28<35------p2 指向P2,以此类推,找到28
路数=关键字个数+1,二叉树存储一个关键字,三路
MYSQL索引机制_第10张图片
多路查找树解决了二叉树高度的问题,变成了矮胖型。
对于磁盘预读问题,关键字个数可以全部存满,路数就是关键字个数+1,很好的利用了磁盘交互的特性。索引在定义字段长度的时候,要利用合适长度,这样路数才能尽可能的多,树的高度比较矮。

B+树(加强版B树)

B+树就是B树的一个编译,关键字采用的是左闭合区间。MYSQL索引机制_第11张图片
采用左闭合区间的意义是,非叶子节点不保存数据,比如我们查找1 ,在根节点就对比到,但是我们会继续查找到P1,最终指向了P1的数据存储区,也就是根节点此时不保存任何数据信息。只保存了关键字和子节点引用信息。
MYSQL索引机制_第12张图片
最后一条,指的就是叶子节点存的数据是有序数据,前一个叶子节点的数据末尾指向下一个叶子节点的开始,都是有序数据。
在这里插入图片描述

B树和B+树对比

(扫库扫表不太理解)
磁盘能力,数据不存在每个节点中,B+树存储在最后一层叶子节点中,也就是说上面的每页能存储更多的关键字,树的高度更小
MYSQL索引机制_第13张图片

B+树的具体落地

Myisam的具体实现,索引没有级别之分,一个表会生成另外两个文件,一个是索引结构,一个具体的数据文件
MYSQL索引机制_第14张图片
INNODB
只会生成一个文件,数据和关键字等存储在一个文件中
MYSQL索引机制_第15张图片
辅助索引指向主键,在查询命中了一个辅助索引时,查询到末尾指向了主键索引,再继续查找到具体的数据
MYSQL索引机制_第16张图片
主键索引要设置,发生变化时,不需要返回维护辅助索引的叶子节点。(主键索引不指定,会采用隐藏的row(id)代替,数据发生合并时,数据地址会发生变化,还需要维护辅助索引的结构,)—为什么辅助索引叶子节点不存储数据
innodb是98.8%的选择

mysql索引原则

列的离散性

计算列的离散型,离散型越高,选择性越高
MYSQL索引机制_第17张图片
例如我们采用性别建立索引,模仿插入规则,在查找1男性的时候,在第二级就全部命中了,分散性特性差,查询优化到第二级的时候,不知道该如何查询,会产生重复查询(离散型太差,优化器会忽略优化查询,全表查询)MYSQL索引机制_第18张图片

最左匹配原则

对索引中关键字进行对比计算,一定是从左到右依次进行,不可跳过

联合索引

一个索引包含多列,单列索引是一个特殊的联合索引
MYSQL索引机制_第19张图片

MYSQL索引机制_第20张图片

覆盖索引

覆盖索引指的是select信息包含了where中名字的索引,而这个索引直接是节点,不需要回溯到表中拿数据信息,直接把节点信息返回,
!!!辅助索引叶子节点指向主键索引,其他索引之间没有任何关系

MYSQL索引机制_第21张图片
最左匹配原则
MYSQL索引机制_第22张图片

你可能感兴趣的:(mysql)