top
Loading...
7.2.8.MySQL如何優化DISTINCT
7.2.8. MySQL如何優化DISTINCT

在許多情況下結合ORDER BYDISTINCT需要一個臨時表。

請注意因為DISTINCT可能使用GROUP BY,必須清楚MySQL如何使用所選定列的一部分的ORDER BYHAVING子句中的列。參見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_countDISTINCT后,MySQL發現唯一的row_count行后立即停止。

如果不使用查詢中命名的所有表的列,MySQL發現第1個匹配后立即停止掃描未使用的表。在下面的情況中,假定t1t2之前使用(可以用EXPLAIN檢查),發現t2中的第1行后,MySQL不再(t1中的任何行)t2

SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;
作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
北斗有巢氏 有巢氏北斗