【发布时间】:2020-01-18 12:57:03
【问题描述】:
我在查询的 Where 子句中的列上有复合索引,但我应该在索引中添加 Group By 和 Order By 列吗?
例如我有一个查询:
select c1, c2
from table t1
where c3 = "A"
and c4 = "B"
Group By c1
Order By c5
我当前的索引在 c3 和 c4 上(与查询的顺序相同)。是否应该在索引中添加 c1 和 c4 以提高查询性能?
【问题讨论】:
-
查询(有点)荒谬,这也使问题变得荒谬。一个好的经验法则是“如果你没有任何聚合函数,那么你就不需要 GROUP BY 子句”。如果您只想返回 DISTINCT 结果,请使用 DISTINCT。
-
很难用这么少的上下文回答这个问题,但作为一般建议,我建议使用 EXPLAIN 来确定哪些索引用于给定查询:dev.mysql.com/doc/refman/5.7/en/explain.html
-
大概学习如何使用
GROUP BY。如果没有任何聚合,它就毫无用处。 -
正如草莓所说,您的假设查询是不切实际的。此外,由于 Order By 子句中使用的非聚合和非选择字段,它将无效并引发错误。无论如何,如果您正在寻找一些关于索引的提示,您可以阅读以下内容:mysql.rjweb.org/doc.php/index_cookbook_mysql
-
示例查询有点好笑,但我认为这里真正的问题是mysql是否使用索引来优化group by/order by?按方面的顺序在这里回答dba.stackexchange.com/questions/11031/…