第7章:优化 / 7.2. 优化SELECT语句和其它查询 / 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;