一尘不染

MySQL索引和顺序

mysql

这是我永远遇到的一个问题。

据我所知,索引的顺序很重要。因此,类似的索引与[first_name, last_name] 并不相同[last_name, first_name],对吧?

如果我仅定义第一个索引,是否意味着它将仅用于

SELECT * FROM table WHERE first_name="john" AND  last_name="doe";

而不是

SELECT * FROM table WHERE  last_name="doe" AND first_name="john";

由于我使用的是ORM,所以我不知道这些列的调用顺序。这是否意味着我必须在所有排列上添加索引?如果我有2列索引,那是可行的,但是如果我的索引是3列或4列怎么办?


阅读 810

收藏
2020-05-17

共1个答案

一尘不染

当查询条件仅适用于 部分 索引时,索引顺序很重要。考虑:

  1. SELECT * FROM table WHERE first_name="john" AND last_name="doe"

  2. SELECT * FROM table WHERE first_name="john"

  3. SELECT * FROM table WHERE last_name="doe"

如果你的索引是(first_namelast_name)查询1和2将使用它,查询#3不会。如果你的索引是(last_namefirst_name)查询1和3将使用它,查询#2不会。在两种情况下,在WHERE子句中更改条件顺序均无效。

详情在这里

更新
如果上述内容不清楚-
如果查询条件中的列形成索引的最左前缀,则MySQL仅可以使用索引。上面的查询#2不能使用(last_namefirst_name因为它只是基于)指数first_namefirst_name不是(最左边的前缀last_namefirst_name)指数。

查询中条件的顺序无关紧要;上面的查询#1可以很好地使用(last_namefirst_name)索引,因为它的条件是
first_name和,last_name并且加在一起,它们确实形成(last_namefirst_name)索引的最左前缀。

2020-05-17