当查询条件仅适用于 部分 索引时,索引顺序很重要。考虑:
SELECt * FROM table WHERe first_name="john" AND last_name="doe"
SELECt * FROM table WHERe first_name="john"
SELECt * FROM table WHERe last_name="doe"
如果你的索引是(
first_name,
last_name)查询1和2将使用它,查询#3不会。如果你的索引是(
last_name,
first_name)查询1和3将使用它,查询#2不会。在两种情况下,在WHERe子句中更改条件顺序均无效。
详情在这里
更新 :
如果上述内容不清楚-
如果查询条件中的列形成索引的最左前缀,则MySQL仅可以使用索引。上面的查询#2不能使用(
last_name,
first_name因为它只是基于)指数
first_name和
first_name不是(最左边的前缀
last_name,
first_name)指数。
查询中条件的顺序无关紧要;上面的查询#1可以很好地使用(
last_name,
first_name)索引,因为它的条件是
first_name和,
last_name并且加在一起,它们确实形成(
last_name,
first_name)索引的最左前缀。



