MySLQ查询优化之distinct优化

原文地址:https://dev.mysql.com/doc/refman/5.7/en/distinct-optimization.html

译文:

8.2.1.16 DISTINCT优化

在许多情况下,DISTINCT与ORDER BY结合使用需要一个临时表。DISTINCT可能使用GROUP BY,想要了解MySQL是如何处理不在select列表中但在ORDER BY或HAVING子句的列,可以参考Section 12.20.3, “MySQL Handling of 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优化的更多细节,可以参考Section 8.2.1.15, “GROUP BY Optimization”

当DISTINCT与LIMIT row_count结合使用时,MySQL一旦找到row_count个唯一的行后,就会立即停止。

如果不使用查询中列举出的所有表的列,MySQL会在找到第一个匹配项时停止扫描任何未使用的表。在下面的例子中,假设表t1先于表t2使用(可以通过explain查询),MySQL在找到表t2中的第一行时会停止从t2读取(对于t1中的任何特定行):

SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;

PS:由于水平有限,译文中难免会有谬误,欢迎批评指正。

猜你喜欢

转载自blog.csdn.net/qq_41080850/article/details/85629698
今日推荐