[英]Does the order of JOIN vs WHERE in SQL affect performance?
在 SQL 中,JOIN 與 WHERE 的順序對查詢性能有多大影響?
a) SELECT […] 從 A JOIN ( SELECT […] 從 B WHERE CONDITION ) ON […]
b) SELECT […] 從 A JOIN ( SELECT […] 從 B ) ON […]條件
我的內心感覺告訴我,選項 a) 應該更高效:如果我們先進行連接,然后運行 where,它的性能似乎比首先在一個表上運行 where 並從執行連接的結果低得多。 但我不確定,因為這取決於 SQL 庫本身的內部優化。
很高興知道 MySQL 和 PostgreSQL 的行為是否相同,以及它是否依賴於group by
或order by
任何其他裝飾器。
在所有其他因素相同的情況下,我希望 A 版本的性能優於 B 版本,正如您似乎也期望的那樣。 主要原因是 A 版本允許數據庫在子查詢中使用WHERE
子句丟棄行。 然后連接只需要涉及一個較小的中間表。 兩者之間的確切性能差異將取決於基礎數據和實際查詢。 請注意,甚至有可能兩個查詢都可以在后台優化為相同或非常相似的執行計划。
Postgres 有一個智能優化器,所以在大多數情況下,兩個版本應該有相似的執行計划(我稍后會回到那個)。
MySQL 有實現子查詢的趨勢。 盡管這在最近的版本中變得更好,但我仍然建議避免使用它。 實現子查詢會阻止索引的使用,並且會對性能產生重大影響。
一個警告:如果子查詢很復雜,那么作為子查詢的一部分進行過濾可能會更好。 例如,如果它是一個聚合,那么在聚合之前進行過濾通常會產生更好的性能。 也就是說,Postgres 很聰明地將條件推送到子查詢中。 因此,如果外部過濾是在聚合中使用的鍵上,Postgres 足夠聰明,可以將條件推送到子查詢中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.