Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

10.2.1.18 DISTINCT 优化

DISTINCTORDER BY 结合需要临时表在许多情况下。

因为 DISTINCT 可能使用 GROUP BY,了解 MySQL 如何处理 ORDER BYHAVING 子句中的列,这些列不在所选列中。请参阅 第 14.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 查询的优化可能性,请参阅 第 10.2.1.17 节,“GROUP BY 优化”

当将 LIMIT row_countDISTINCT 结合时,MySQL 将在找到 row_count 个唯一行时停止。

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

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