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的,你不用擔心第一種寫法會讓它多算很多東西。
- 首先你需要看是什麼資料庫
- 不同的資料庫有不同的優化方案
- 比如MySQL的優化器在這方面沒什麼建樹 需要自己優化SQL
- 比如PostgreSQL的優化器有黑科技神經遺傳演算法
- 題主給出的資料不足能導出任何分析結論
題主給出的 資料不包含
資料庫 資料庫版本 數據規模 欄位屬性 等信息答主表示無法做出客觀的分析
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-windowsEXPLAIN 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 &
2 DERIVED green_post_cat ref cat_id cat_id 8 const 9
Profile 1
Profile 2
但是就像上面大牛們所說,樓主的條件還不夠精確,比如外鍵 索引 等等。
這裡的GreenCMS posts表中post_id主鍵,cat_id, post_id都自帶索引結果上表所示,顯然第一條,子查詢的效率是相當低的,盡量少用子查詢
這個是連接條件與查詢條件的pk。我覺得在連接的時候就篩選掉不滿足條件的數據,效率會高一些吧。我也不甚了解,歡迎拍磚
首先這兩個結果可能是不一樣的,效率是可以定義優化的
顯然第一條。尤其是欄位設置了索引,索引檢索比全表檢索要快。第二個子查詢結果和a表外結的檢索方式,應該算全表查詢(?)
推薦閱讀:
※為什麼php在向mysql提交數據時變數外要用單引號?
※SQL Server 與 MySQL 性能相差多大?
※產品DBA、開發DBA、運維DBA的區別?
※MySQL多表關聯查詢效率高點還是多次單表查詢效率高,為什麼?
※如何才能招到優秀的 MySQL DBA?