DISTINCT
在许多情况下结合ORDER
BY
需要一个临时表。
因为DISTINCT
可能会使用GROUP
BY
,所以了解 MySQL 如何处理
不属于所选列的ORDER BY
or子句中的列。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_count
DISTINCT
row_count
如果您不使用查询中命名的所有表中的列,MySQL 会在找到第一个匹配项后立即停止扫描任何未使用的表。在以下情况下,假设
t1
之前使用过t2
(您可以检查
),MySQL 在找到第一行时
EXPLAIN
停止读取t2
(对于任何特定行
) :
t1
t2
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;