DISTINCT 优化
跳到导航
跳到搜索
在许多情况下,DISTINCT 结合 ORDER BY 需要使用临时表。
因为 DISTINCT 可能使用 GROUP BY,请了解 MySQL 如何处理 ORDER BY 或 HAVING 子句中未包含在选定列中的列。
在大多数情况下,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 子句的查询。
在将 LIMIT row_count 与 DISTINCT 结合使用时,MySQL 会在找到 row_count 个唯一行后立即停止。
如果您在查询中未使用所有表的列,请注意,MySQL 会在找到第一个匹配项后立即停止扫描未使用的表。在下面的情况中,假设 t1 在 t2 之前被使用(您可以使用 EXPLAIN 进行检查),当在 t1 的特定行中找到 t2 的第一行时,MySQL 会停止从 t2 中读取:
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;