通过我的测试得出的结论:
如果索引是(a,b,c)那么不只是a,ab,abc可以走索引,像是bc.acb,bca都可以走索引,or < > between and甚至是in都也是可以走到索引的。(我在很多文章看到说in不能走索引,包括在面试中,面试官也觉得不会走索引的,这个也能跟mysql的版本有关系,下来再去研究下)
在google我找到这样的解释
百度上说:
1,
2,
mysql版本:8.0.18
sql:
建立索引:
ALTER TABLE student ADD INDEX index_student (NAME,weight,height);
验证最左优先原则:
执行:EXPLAIN SELECT * FROM student WHERE NAME = ‘xiaohong’
可以看到走了索引
EXPLAIN SELECT * FROM student WHERE NAME = ‘xiaohong’ AND weight > 120
这样肯定能走索引,再来看一个ba组合
EXPLAIN SELECT NAME,weight,gender FROM student WHERE weight > 120 AND NAME = ‘xiaohong’
这样要可能走索引,但是这个并不满足最左优先原则
还有cba这样的组合也能走索引 ,有点疑惑,不知道是不是innodb优化了sql
EXPLAIN SELECT NAME,weight,gender FROM student WHERE height = 110 AND weight > 120 AND NAME IN (‘xiaohong’)
但是cb bc是不能走索引的
最左优先说会从左向又一次匹配知道遇到> < between and就会停止匹配,
EXPLAIN SELECT * FROM student WHERE NAME = ‘xiaohong’ OR height IN (120,110) OR weight > 120
竟然这样也可以执行到索引。
单独使用in,
执行EXPLAIN SELECT * FROM student WHERE NAME IN (‘xiaohong’)
结论:
如果索引是(a,b,c)那么不只是a,ab,abc可以走索引,像是bc.acb,bca都可以走索引,or < > between and甚至是in都也是可以走到索引的。(我在很多文章看到说in不能走索引,包括在面试中,面试官也觉得不会走索引的