8.2.1.16 DISTINCT 优化

在许多情况下,DISTINCTORDER BY结合需要一个临时 table。

由于DISTINCT可能会使用GROUP BY,因此请了解 MySQL 如何处理不属于所选列的ORDER BYHAVING子句中的列。参见第 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_countDISTINCT时,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;