top
Loading...
7.2.9.MySQL如何優化LEFTJOIN和RIGHTJOIN
7.2.9. MySQL如何優化LEFT JOIN和RIGHT JOIN

MySQL中,A LEFT JOIN B join_condition執行過程如下:

·         根據表AA依賴的所有表設置表B

·         根據LEFT JOIN條件中使用的所有表(除了B)設置表A

·         LEFT JOIN條件用于確定如何從表B搜索行。(換句話說,不使用WHERE子句中的任何條件)

·         可以對所有標準聯接進行優化,只是只有從它所依賴的所有表讀取的表例外。如果出現循環依賴關系,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,只是表的角色反過來。

聯接優化器計算表應聯接的順序。LEFT JOINSTRAIGHT_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;

在這種情況下修復時用a的相反順序,b列于FROM子句中:

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;

MySQL可以進行下面的LEFT JOIN優化:如果對于產生的NULL行,WHERE條件總為假,LEFT JOIN變為普通聯接。

例如,在下面的查詢中如果t2.column1NULLWHERE 子句將為false

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.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
北斗有巢氏 有巢氏北斗