mysql - MySQL 的 Index 中添加 Group By 和 Order By 列好不好

标签 mysql indexing

我在查询的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/

相关文章:

mysql - 如何对这样的 MySQL 表进行透视和计数?

python - 将字符串设置为 pandas DataFrame 的索引

Mysql 索引与 LIKE 和排序

mysql - 使用 Hibernate 和 MySQL,全局和本地的 Spring 事务管理

mysql join消除重复

php - 在 MySQL Double(9,8) 列中插入值 10 并以 9.99999999 结尾

sql - 甲骨文 : Single multicolumn index or two single column indexes

sql - 表的主键是否有索引?

sql - SQL Server 索引使用统计何时更新?

mysql - 带索引的 order by limit 的缓慢 MySql 查询