索引(A,B)是否可以在ORDER BY A中用于WHERE A> const AND B = const。 &c>常量

时间:2016-11-19 12:21:23

标签: mysql

我有以下查询:

SELECT (..) FROM db WHERE A > const. AND B = const. AND C > const. ORDER BY A DESC LIMIT const.

我绝对需要一个多列索引(A,B),因为A过滤器不够强大。但是这个索引可以用在ORDER BY A语句中还是需要一个(A,B,C)索引?

2 个答案:

答案 0 :(得分:1)

是的,索引索引(A,B)在您的位置和按顺序使用

请参阅此http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

  

即使ORDER BY与之匹配,也可以使用索引   索引完全,只要索引的所有未使用部分和所有   额外的ORDER BY列是WHERE子句中的常量。该   以下查询使用索引来解析ORDER BY部分:

SELECT * FROM t1
  ORDER BY key_part1,key_part2,... ;

答案 1 :(得分:0)

在此查询中:

SELECT (..)
FROM db
WHERE A = const. AND B = const. AND C = const.
ORDER BY A DESC
LIMIT const.

ORDER BY是多余的 - 您已明确声明A是常量。您应该从查询中完全删除ORDER BY

这不是documentation中的一个明确示例,因此我不确定MySQL在这种情况下是否足够聪明以使用索引。 MySQL不一定会优化具有不必要ORDER BY的查询,因此最好的办法是检查执行计划。

要明确,以下内容应使用ORDER BY的索引:

WHERE A = const.
ORDER BY B
LIMIT const.

或者:

WHERE A = const. AND B = const.
ORDER BY C
LIMIT const.

编辑:

(这就是我回答的原因)

如果你的条件是a > const 与其他条件,那么我认为不会使用索引。你可以做:

SELECT *
FROM (SELECT (..)
      FROM db
      WHERE A > const.
      ORDER BY A DESC
     ) a
WHERE B = const. AND C > const. 
LIMIT const.

应该使用子查询的索引。然后进行过滤(不使用索引,但无论如何您需要select . . .的数据页。

注意:我不喜欢这个解决方案。在SQL中,通常不应假定子查询按特定顺序排列。但是,它确实在MySQL中工作,并且基本上记录为工作,因为MySQL实现了子查询。