Skip to main content

18.DISTINCT 优化

DISTINCT 与 ORDER BY 结合在很多情况下都需要临时表。

由于 DISTINCT 可能使用 GROUP BY,因此请了解 MySQL 如何处理 ORDER BY 或 HAVING 子句中不属于所选列的列。

在大多数情况下,DISTINCT 子句可以被视为 GROUP BY 的特殊情况。 例如,以下两个查询是等效的:

SELECT DISTINCT c1, c2, c3 FROM t1
WHERE c1 > const;

SELECT c1, c2, c3 FROM t1
WHERE c1 > const GROUP BY c1, c2, c3;

由于这种等效性,适用于 GROUP BY 查询的优化也可以应用于具有 DISTINCT 子句的查询。

当将 LIMIT row_count 与 DISTINCT 结合使用时,MySQL 一旦发现 row_count 唯一行就会停止。

如果不使用查询中指定的所有表中的列,MySQL 一旦找到第一个匹配项就会停止扫描任何未使用的表。 在以下情况下,假设 t1 在 t2 之前使用(可以使用 EXPLAIN 检查),当 MySQL 在 t2 中找到第一行时,它会停止从 t2 读取(对于 t1 中的任何特定行):

SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;