我有以下查询:
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)索引?
答案 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实现了子查询。