Mysql索引结构与失效场景

注:Mysql排序实例:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

1、B树与B+树之间的区别


B树:
1)一个节点有多个元素(元素个数与degree深度有关)
2)当前节点的所有左边节点都是比它小的,右边节点都是比它大的
3)整棵树都是已经排序的,包括节点内部的


B+树:
1)一个节点有多个元素
2)叶子节点是按顺序排放的
3)叶子节点之间直接有双向指针相连
4)叶子节点包括所有数据,非叶子节点数据属于冗余数据

2、Innodb中的B+树是怎么产生的?
1)取数据的最小单位:页(page) 16KB

2)页的结构

3)新增数据默认存放是按主键排序
4)索引类似于目录(章、节),一个节点最大存储数据是一页(16K)。

3、深度为3的B+树最大可以存多少条数据

注:其中14是每条数据所在空间大小(和数据类型有关)

4、Innodb 是如何走索引的
先按主键生成主键索引,按主键顺序生产B+树,其中叶子节点存放的是数据值,属于聚簇索引;
然后其他自建索引结构类似,只不过这些索引的叶子节点存档的是数据记录的主键信息,属于非聚簇索引;
故在使用非主键索引查找时,如果需要查找的数据字段不在索引的叶子节点中时,需要根据叶子节点中存放的主键再查一次,即做一次回表查询,得到所要查询的字段;

5、联合索引为什么支持的是最左原则
联合索引是类似将所有字段拼接为整体作为索引,需要先按首字段比对后再比对后面的字段;
需要注意的是where语句后面的条件排序不影响查询,只要求最字段存在即可;

6、范围查找导致索引失效的原因
非聚簇索引查找范围信息时,若查找字段在不在其叶子节点内时,需要再根据叶子节点中的主键信息再做一次回表操作,若查询所得范围占整体大部分时,其比对次数大于直接轮询表次数,所以失效。失效与查找的范围条件有关。

7、覆盖索引的底层原理
查找的字段在非聚簇索引的叶子节点存在(包括主键信息),此时为覆盖索引。

8、索引扫描底层原理
查找的字段在非聚簇索引的叶子节点存在(包括主键信息),即使不加条件,优先也是从非聚簇索引,存放信息少,速率快,不要求最左原则,因为是全部扫描。

9、order by 为什么会导致索引失效
排序字段在非聚簇索引的索引中都出现时,若查询字段在索引字段中,则直接可以返回当前索引数据;若查询字段不在索引字段中,则需要做一次回表操作,这样远不如直接轮询全表的速率,故索引失效。

10、Mysql中数据类型转换注意点
若字符字段与数据字段比较时,Mysql会将非数字字符转化成0,然后再作比较运算。

11、字段查询导致索引失效的场景
若字符字段与数据字段比较时,Mysql会将非数字字符转化成0,然后再作比较运算,但是我们的非聚簇索引存放的是字符串信息,故索引会失效。

参考视频:https://www.bilibili.com/video/BV1Ys4y1J7iY/

posted @ 2024-03-22 15:12  陛下化缘  阅读(13)  评论(0编辑  收藏  举报