DISTINCT 优化

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年8月29日 (二) 09:03的版本 (创建页面,内容为“ 在许多情况下,DISTINCT 结合 ORDER BY 需要使用临时表。 因为 DISTINCT 可能使用 GROUP BY,请了解 MySQL 如何处理 ORDER BY 或 HAVING 子句中未包含在选定列中的列。 在大多数情况下,DISTINCT 子句可以被视为 GROUP BY 的特殊情况。例如,以下两个查询是等价的: <pre>SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 > const; SELECT c1, c2, c3 FROM t1 WHERE c1 > const GROUP BY c1, c2, c3;</pre…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

在许多情况下,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;