1. 程式人生 > >MySLQ查詢優化之distinct優化

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:由於水平有限,譯文中難免會有謬誤,歡迎批評指正。