Mysql A是否可以按顺序使用索引(A,B),其中A>;常数和B=常数。及c>;常数

Mysql A是否可以按顺序使用索引(A,B),其中A>;常数和B=常数。及c>;常数,mysql,Mysql,我有以下疑问: SELECT (..) FROM db WHERE A > const. AND B = const. AND C > const. ORDER BY A DESC LIMIT const. 我肯定需要一个多列索引(a,B),因为a过滤器不够强大。但是这个索引可以通过一个语句在顺序中使用,还是需要一个(A,B,C)索引?是的,索引(A,B)在where和ORDER BY中都使用 看到这个了吗 即使ORDER BY与 只要索引的所有未使用部分和所有 额外的ORDER

我有以下疑问:

SELECT (..) FROM db WHERE A > const. AND B = const. AND C > const. ORDER BY A DESC LIMIT const.
我肯定需要一个多列索引(a,B),因为a过滤器不够强大。但是这个索引可以通过一个语句在
顺序中使用,还是需要一个(A,B,C)索引?

是的,索引(A,B)在where和ORDER BY中都使用

看到这个了吗

即使ORDER BY与 只要索引的所有未使用部分和所有 额外的ORDER BY列是WHERE子句中的常量。这个 以下查询使用索引按部分解析订单:

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.
orderby
是多余的——您已经明确声明
A
是一个常量。您应该从查询中完全删除
ORDER BY

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

为清楚起见,以下内容应使用排序依据的索引:

WHERE A = const.
ORDER BY B
LIMIT const.
或:

编辑:

(这就是我回答上述问题的原因)

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

这应该使用子查询的索引。然后进行过滤(不使用索引,但您仍然需要
select…
的数据页)


注意:我不喜欢这种解决方案。在SQL中,通常不应假定子查询是按特定顺序进行的。但是,它在MySQL中确实有效,并且基本上被记录为有效,因为MySQL实现了子查询。

感谢您的提示,我实际上有条件a>const。我更正了我的帖子。
WHERE A = const. AND B = const.
ORDER BY C
LIMIT const.
SELECT *
FROM (SELECT (..)
      FROM db
      WHERE A > const.
      ORDER BY A DESC
     ) a
WHERE B = const. AND C > const. 
LIMIT const.