我在查询的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以提高查询性能?
最佳答案
这取决于。
where c3 = "A"
and c4 = "B"
Group By c1
Order By c5
可以使用其中任何一个:
INDEX(c3, c4, c1)
INDEX(c4, c3, c1)
它无法通过GROUP BY
到达ORDER BY
(除非它们相同)。
另一方面,这更难优化:
where c3 > "A" -- note the inequality (a "range")
and c4 = "B"
Group By c1
Order By c5
这是最好的:
INDEX(c4, c3) -- the order matters now: '=' first
进一步:
where c3 = "A"
and c4 = "B"
Group By c1
Order By c1 -- same as GROUP BY
LIMIT 10 -- now can get to this
如果有的话,这将在 10 行后停止
INDEX(c3, c4, c1) or INDEX(c4, c3, c1)
向其他示例添加 LIMIT
:他们会找到所有行,对它们进行排序,然后交付 10 行。
更多最优综合指标讨论:http://mysql.rjweb.org/doc.php/index_cookbook_mysql
要使索引“覆盖”,请添加(在末尾)查询中的任何其他列。 (但是不要对此得意忘形。经验法则:不要创建超过 5 列的索引。)“覆盖”会额外提高速度,因为查询可以完全在索引的 BTree 中执行.
关于mysql - MySQL 的 Index 中添加 Group By 和 Order By 列好不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57978003/