8.2.1.16 DISTINCT 优化
在许多情况下,DISTINCT
和ORDER BY
结合需要一个临时 table。
由于DISTINCT
可能会使用GROUP BY
,因此请了解 MySQL 如何处理不属于所选列的ORDER BY
或HAVING
子句中的列。参见第 12.20.3 节“ MySQL BY 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.15 节,“通过优化组”。
当结合LIMIT row_count
和DISTINCT
时,MySQL 一旦找到* row_count
*唯一行,就会停止运行。
如果您不使用查询中命名的所有 table 中的列,则 MySQL 会在找到第一个匹配项后立即停止扫描任何未使用的 table。在以下情况下,假设在t2
之前使用t1
(您可以使用EXPLAIN进行检查),则当 MySQL 在t2
中找到第一行时,它将停止从t2
(对于t1
中的任何特定行)读取:
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;