7.2.8.MySQL如何優化DISTINCT
7.2.8. MySQL如何優化DISTINCT
在許多情況下結合ORDER BY的DISTINCT需要一個臨時表。
請注意因為DISTINCT可能使用GROUP BY,必須清楚MySQL如何使用所選定列的一部分的ORDER BY或HAVING子句中的列。參見12.10.3節,“具有隱含字段的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查詢的優化的更詳細的情況,參見7.2.13節,“MySQL如何優化GROUP BY”。
結合LIMIT row_count和DISTINCT后,MySQL發現唯一的row_count行后立即停止。
如果不使用查詢中命名的所有表的列,MySQL發現第1個匹配后立即停止掃描未使用的表。在下面的情況中,假定t1在t2之前使用(可以用EXPLAIN檢查),發現t2中的第1行后,MySQL不再(為t1中的任何行)讀t2:
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;