SQL中 LEFT JOIN ON 條件的效率高低比較?

SELECT * FROM TABLEA A LEFT JOIN TABLEB ON A.ID = B.ID AND B.NAME = "123"

SELECT * FROM TABLEA A LEFT JOIN (SELECT * FROM TABLEB WHERE B.NAME = "123") B ON A.ID = B.ID
這兩條SQL得出的結果是一樣的 但是在數據量比較大的時候 哪一條的效率要高一些


你用SQLServer Management Studio分別發兩條query看query plan就知道了,我認為SELECT *之後只有where的應該會優化成跟第一條一樣。

SQLServer會自己判斷先join還是先where的,你不用擔心第一種寫法會讓它多算很多東西。


  1. 首先你需要看是什麼資料庫

  2. 不同的資料庫有不同的優化方案
    1. 比如MySQL的優化器在這方面沒什麼建樹 需要自己優化SQL
    2. 比如PostgreSQL的優化器有黑科技神經遺傳演算法
  3. 題主給出的資料不足能導出任何分析結論

    題主給出的 資料不包含

    資料庫 資料庫版本

    數據規模 欄位屬性

    等信息

    答主表示無法做出客觀的分析


EXPLAIN SELECT * FROM green_posts LEFT JOIN green_post_cat ON green_posts.post_id = green_post_cat.post_id AND green_post_cat.cat_id=1 ;

EXPLAIN SELECT * FROM green_posts LEFT JOIN (SELECT * FROM green_post_cat WHERE green_post_cat.cat_id=1) B ON green_posts.post_id = B.post_id;

其實AND green_post_cat.cat_id=1 ; 等價於Where green_post_cat.cat_id=1 ;了,至少MySQL是這樣

語句來源GreenCMS

MySQL版本5.6.17-windows

EXPLAIN 1

1 SIMPLE green_posts ALL 507
1 SIMPLE green_post_cat ref post_id,cat_id cat_id 8 const 9 Using where

EXPLAIN 2

1 PRIMARY green_posts ALL 507
1 PRIMARY & ALL 9 Using where; Using join buffer (Block Nested Loop)
2 DERIVED green_post_cat ref cat_id cat_id 8 const 9

Profile 1

Profile 2

時間上雖然會有誤差,但是顯然第一種在MySQL上要好。。。

但是就像上面大牛們所說,樓主的條件還不夠精確,比如外鍵 索引 等等。

這裡的GreenCMS posts表中post_id主鍵,cat_id, post_id都自帶索引

結果上表所示,


顯然第一條,子查詢的效率是相當低的,盡量少用子查詢


這個是連接條件與查詢條件的pk。我覺得在連接的時候就篩選掉不滿足條件的數據,效率會高一些吧。我也不甚了解,歡迎拍磚


首先這兩個結果可能是不一樣的,

效率是可以定義優化的


顯然第一條。

尤其是欄位設置了索引,索引檢索比全表檢索要快。

第二個子查詢結果和a表外結的檢索方式,應該算全表查詢(?)


推薦閱讀:

為什麼php在向mysql提交數據時變數外要用單引號?
SQL Server 與 MySQL 性能相差多大?
產品DBA、開發DBA、運維DBA的區別?
MySQL多表關聯查詢效率高點還是多次單表查詢效率高,為什麼?
如何才能招到優秀的 MySQL DBA?

TAG:SQL | MySQL | SQL語句 |