MySQL索引部分生效原理是什么

MySQL版本5.6,Innodb引擎
如果数据库表是按照(a,b,c)建的联合索引

select * from myTest where a=3  and c=7;//a使用到了,c没有
select * from myTest where a=3  and b>7 and c=3;//a,b使用到了,c没有。
select * from myTest where a=3  and b>=7 and c=3;//abc都使用到了

上面3句sql都可以使用到联合索引,但是第一个是a使用到了,c没有
第二个是a,b使用到了,c没有。
第三个是abc都使用到了。
我就是不太理解为什么索引部分字段失效的原理?有没有大佬简单说一下上面的原因呢?
我知道:首先按照 a 进行排序,然后在相同 a 值的情况下按照 b 进行排序,最后在相同 a 和 b 值的情况下按照 c 进行排序
但是我想知道为什么部分字段没有用到索引,原理是什么?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

1和3 =》 联合索引的数据也是有按顺序存储进去的,如果想在联合索引中使用尽可能多的列,索条件中的各个列必须是联合索引中从最左边连续的列。

2和3 =》 记录都是按照索引列的值从小到大的顺序排好序的,如果对多个列同时进行范围查找的话,只有对索引最左边的那个列进行范围查找的时候才能用到B+树索引


至于3 可以拆解成
a=3 and b>7 and c=3

a=3 and b=7 and c=3 (这个是能用到 abc的)


推荐书籍:MySQL 是怎样运行的:从根儿上理解 MySQL - 第六章 和 第七章
会详细讲解这块

10个月前 评论
讨论数量: 9

联合索引(a,b,c)相当于a,ab,abc这3个索引--所以第一个你应该能明白了 至于后面2个的为什么一个用了ab,一个用了abc我就不清楚了

10个月前 评论

跟上面的兄弟说的一样,联合索引 (a,b,c) 相当于 a, ab, abc 这 3 个索引,所以:

第一个跳过了 b,只能匹配 a。

第二个 b > 7 是范围条件,对于范围条件查询,MySQL 无法再使用范围列后面的其他索引列,所以无法使用 abc ,匹配 ab。

第三个我不确定,感觉上应该是 MySQL 的优化器把查询条件拆分了,where 条件变成了 a = 3 and b = 7 and c= 3 and b > 7,前三个条件可以匹配到索引 abc。

10个月前 评论
bluememory (楼主) 10个月前
Imuyu 10个月前
bluememory (楼主) 10个月前

看起来就是等于的时候会用到索引

10个月前 评论
九霄道长

索引构建上 首先按照 a 进行排序,然后在相同 a 值的情况下按照 b 进行排序,最后在相同 a 和 b 值的情况下按照 c 进行排序 具体可以看看 b+ 树的构建

不太了解的话可以先看看二叉搜索树

二叉搜索树,AVL树 - VisuAlgo

这里可以动态插入,删除,还有动画.

10个月前 评论

1和3 =》 联合索引的数据也是有按顺序存储进去的,如果想在联合索引中使用尽可能多的列,索条件中的各个列必须是联合索引中从最左边连续的列。

2和3 =》 记录都是按照索引列的值从小到大的顺序排好序的,如果对多个列同时进行范围查找的话,只有对索引最左边的那个列进行范围查找的时候才能用到B+树索引


至于3 可以拆解成
a=3 and b>7 and c=3

a=3 and b=7 and c=3 (这个是能用到 abc的)


推荐书籍:MySQL 是怎样运行的:从根儿上理解 MySQL - 第六章 和 第七章
会详细讲解这块

10个月前 评论

第二个 为什么遇到>后面字段就使用不到索引? 因为b>7 筛选出的结果范围太大,可能有8 - 无穷尽,那么在b筛选后这个范围再去找符合c条件的数值,就和一行行扫描没啥区别了,也就是索引失效了吧。

我的理解是这样的。

10个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!