Documentation Home

8.2.1.15 DISTINCT 优化

DISTINCT在许多情况下结合ORDER BY需要一个临时表。

因为DISTINCT可能会使用GROUP BY,所以了解 MySQL 如何处理 不属于所选列的ORDER BYor子句中的列。HAVING请参阅 第 12.19.3 节,“MySQL 对 GROUP BY 的处理”

在大多数情况下,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子句的查询。因此,有关 DISTINCT查询优化可能性的更多详细信息,请参阅 第 8.2.1.14 节,“GROUP BY 优化”

与结合时 ,MySQL 会在找到唯一行 后立即停止 。LIMIT row_countDISTINCTrow_count

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

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