以下的文章主要是對MySQL聯表查詢優化,LEFT JOIN 和 RIGHT JOIN實際操作的介紹,如果你對其有興趣的話你就可以點擊以下的文章進行觀看了,希望會給你帶來一些幫助在此方面。
A LEFT JOIN B join_condition 在mysql中實現如下:
表 B 依賴於表 A 以及其依賴的所有表。
表 A 依賴於在 LEFT JOIN 條件中的所有表(除了 B)。
LEFT JOIN 條件用於決定如何從表 B 中讀取記錄了(換句話說,WHERE 子句中的任何條件都對此不起作用)。
所有標准的連接MySQL聯表查詢優化都會執行,例外的情況是有一個表總是在它依賴的所有表之後被讀取。如果這是一個循環的依賴關系,那麼MySQL會認為這是錯誤的。
所有的標准 WHERE 優化都會執行。
如果 A 中有一條記錄匹配了 WHERE 子句,但是 B 中沒有任何記錄匹配 ON 條件,那麼就會產生一條 B 記錄,它的字段值全都被置為 NULL。
如果使用 LEFT JOIN 來搜索在一些表中不存在的記錄,並且 WHERE 部分中有檢測條件:col_name IS NULL,col_name 字段定義成 NOT NULL 的話,MySQL就會在找到一條匹配 LEFT JOIN 條件的記錄(用於和特定的索引鍵做聯合)後停止搜索了。
RIGHT JOIN 的實現和 LEFT JOIN 類似,不過表的角色倒過來了。
連接MySQL聯表查詢優化程序計算了表連接的次序。表讀取的順序是由 LEFT JOIN 強行指定的,而且使用 STRAIGHT_JOIN 能幫助連接優化程序更快地執行,因為這就會有更少的表排隊檢查了。注意,這裡是指如果你執行下面這種類型的查詢後,MySQL就會對 b 做一次全表掃描,因為 LEFT JOIN 強制要求了必須在讀 d 之前這麼做:
- SELECT *
- FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
- WHERE b.key=d.key;
解決這種情況的方法是按照如下方式重寫查詢:
- SELECT *
- FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
- WHERE b.key=d.key;
從4.0.14開始,MySQL做如下 LEFT JOIN 優化:如果對產生的 NULL 記錄 WHERE 條件總是 假,那麼 LEFT JOIN 就會變成一個普通的連接。
例如,下面的查詢中如果 t2.column1 的值是 NULL 的話,WHERE 子句的結果就是假了:
- SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
因此,這就可以安全的轉換成一個普通的連接查詢:
- SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
這查詢起來就更快了,因為如果能有一個更好的查詢計劃的話,mysql就會在 t1 之前就用到 t2 了。想要強行指定表順序的話,可以使用 STRAIGHT_JOIN。以上的相關內容就是對MySQL聯表查詢優化:LEFT JOIN 與 RIGHT JOIN的介紹,望你能有所收獲。