MySQL 8.4 发行说明
DISTINCT 与 ORDER BY 组合在许多情况下需要临时表。
因为 DISTINCT 可以使用 GROUP BY,所以请了解 MySQL 如何处理 ORDER BY 或 HAVING 子句中不属于所选列的列。请参阅 第 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 在找到第一个匹配项后立即停止扫描任何未使用的表。在以下情况下,假设 t1 在 t2 之前使用(您可以使用 EXPLAIN 进行检查),当 MySQL 在 t2 中找到第一行时,它会停止从 t2 读取数据(对于 t1 中的任何特定行):
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;