在看 http://tech.meituan.com/mysql-index.html 这篇文章的时候,里面写到创建索引的几大原则中有一条是:
最左前缀匹配原则,非常重要的原则, mysql 会一直向右匹配直到遇到范围查询(>、<、 between 、 like)就停止匹配,比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引, d 是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到, a,b,d 的顺序可以任意调整。
没看明白为什么“(a,b,c,d)顺序的索引, d 是用不到索引的”,而“如果建立(a,b,d,c)的索引则都可以用到”。不是“遇到范围查询(>、<、 between 、 like)就停止匹配”吗,那为什么第二种方式创建索引 d 就能用到索引?
还有个问题,只有 = 号的时候才会用到索引吗?还有其他操作可以用索引吗?
1
hello2t 2016-04-07 16:39:35 +08:00
因为 mysql 内有查询优化,会调整查询条件的顺序。
|
2
Infernalzero 2016-04-07 17:14:26 +08:00
你查询语句条件的顺序不影响索引的使用,mysql 会自动优化,看的是加的联合索引的字段顺序
当然不是只有=号才用索引了,范围查询也会用到的,但不一定用,得 explain 看了,有时候 possible key 会包含对应的索引,但是实际并没有使用, mysql 自己会判断,存在某些特殊情况要 force index 或者 use index ,毕竟程序定的规则不可能覆盖所有情况 |
3
Specs OP |
4
Infernalzero 2016-04-07 18:02:19 +08:00
|
5
Specs OP @Infernalzero 多谢~
|
6
paperen 2016-04-10 19:14:30 +08:00
@Specs @Infernalzero 问下如果分别给 a 、 b 、 c 、 d 字段加索引 与 使用组合索引 在优化上会有什么区别?
|