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

有一个索引(externalproductId,sourceID,另一个场地)。一个解释显示使用了索引。这是在解释的“额外”列中打印的:

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; Using index', ,并摆脱另一个临时表和filesort GROUP BY.

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

其他提示

有几件事要尝试:

  1. MySQL将自动与组对。如果您不在乎排序订单,请添加“按null”子句添加。那将取消文件码和可能的临时表。

  2. 删除计数(*),并使用索引中的列的名称,而不是通配符。

还。您的索引是什么?您可以向我们展示完整的表格语句吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top