10.2.1.18 DISTINCT优化
在许多情况下,DISTINCT与ORDER BY结合使用时需要临时表。
由于DISTINCT可能会用到GROUP BY,所以要了解MySQL如何处理ORDER BY或HAVING子句中不属于所选列的那些列,可参见14.19.3节 “MySQL对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查询的更多优化细节,可参见10.2.1.17节 “GROUP BY优化”。
当LIMIT row_count与DISTINCT结合使用时,MySQL一旦找到row_count个唯一行就会停止查询。
如果在查询中未使用所有表中的列,MySQL一旦找到第一个匹配项,就会停止扫描任何未使用的表。在下面这种情况下,假设EXPLAIN显示t1在t2之前被使用,那么MySQL在找到t2中的第一行(对于t1中的任何特定行)后,就会停止读取t2:
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;












网友评论