我有以下查询:对于WHERE A> const AND B = const,可以在ORDER BY A中使用索引(A,B)。和c>常量
SELECT (..) FROM db WHERE A > const. AND B = const. AND C > const. ORDER BY A DESC LIMIT const.
我肯定需要一个多列索引(A,B)作为过滤器是不够强。但是这个指数可以在ORDER BY A
声明中使用,还是需要(A,B,C)指数?
我有以下查询:对于WHERE A> const AND B = const,可以在ORDER BY A中使用索引(A,B)。和c>常量
SELECT (..) FROM db WHERE A > const. AND B = const. AND C > const. ORDER BY A DESC LIMIT const.
我肯定需要一个多列索引(A,B)作为过滤器是不够强。但是这个指数可以在ORDER BY A
声明中使用,还是需要(A,B,C)指数?
是该指数指数(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,... ;
在此查询:
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实现子查询
感谢您的提示,我实际上有条件A> const。 –