mysql - 为什么以下查询会复制表数据?

标签 mysql database performance group-by covering-index

SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY SourceId, ExternalProductId
HAVING cnt > 1

(ExternalProductId、SourceId、AnotherField) 上有一个索引。解释显示索引已被使用。这打印在解释的“Extra”栏中:

Using where; Using index; Using temporary; Using filesort

当我运行查询时,我通过 SHOW PROCESSLIST 看到:

Copying to tmp table on disk

我可以调整这个查询以在索引上工作吗?我也不介意由于其他进程同时处理该表而导致我得到的结果稍微不准确 - 我可以更改隔离级别以提高查询的性能吗?

最佳答案

如果您颠倒 GROUP BY 中的列以与复合索引前两个字段的顺序相对应,它将更有效地使用您的复合索引。

SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY ExternalProductId, SourceId
HAVING cnt > 1

你的查询执行平原应该变成'Using where;使用index',并摆脱由另一个GROUP BY造成的临时表和文件排序。

您仍然会得到相同的结果,但顺序会略有不同。

关于mysql - 为什么以下查询会复制表数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4462418/

相关文章:

mysql - 对足球数据库进行 SQL 查询,如果记录不存在则假设 0

mysql - 如何将时间戳更新为当前时间,以秒为单位减去 id 字段?

java - Android:从MySQL数据库获取数据

mysql - MySQL中查询的疑惑

performance - Clojure 性能,大向量上的大循环

mysql - 我应该使用两个查询,还是有办法在 MySQL/PHP 中加入这个查询?

mysql - 我如何获取查询列表及其执行计数

php - 如果在另一行中指定,则MySQL选择行

node.js - WebStorm 使用 100% CPU

performance - MacOSX 'free'库什么时候调用madvise,有什么办法控制吗?