关于 MySQL 索引的几个问题

2016-04-07 16:27:40 +08:00
 Specs

在看 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 就能用到索引?

还有个问题,只有 = 号的时候才会用到索引吗?还有其他操作可以用索引吗?

2658 次点击
所在节点    MySQL
6 条回复
hello2t
2016-04-07 16:39:35 +08:00
因为 mysql 内有查询优化,会调整查询条件的顺序。
Infernalzero
2016-04-07 17:14:26 +08:00
你查询语句条件的顺序不影响索引的使用,mysql 会自动优化,看的是加的联合索引的字段顺序
当然不是只有=号才用索引了,范围查询也会用到的,但不一定用,得 explain 看了,有时候 possible key 会包含对应的索引,但是实际并没有使用, mysql 自己会判断,存在某些特殊情况要 force index 或者 use index ,毕竟程序定的规则不可能覆盖所有情况
Specs
2016-04-07 17:46:03 +08:00
@hello2t @Infernalzero 多谢,关于第一个明白了。

@Infernalzero 你说的“范围查询”是指的哪些情况呢? between ? in ?还是什么呢?
Infernalzero
2016-04-07 18:02:19 +08:00
Specs
2016-04-08 11:43:51 +08:00
@Infernalzero 多谢~
paperen
2016-04-10 19:14:30 +08:00
@Specs @Infernalzero 问下如果分别给 a 、 b 、 c 、 d 字段加索引 与 使用组合索引 在优化上会有什么区别?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/269292

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX