1. 程式人生 > >11.MySQL優化Outer Join Optimization

11.MySQL優化Outer Join Optimization

介紹

Outer joins包含LEFT JOIN和RIGHT JOIN.

MySQL實現了一個A LEFT JOIN B join_condition,如下所示:

  • 表B設定為依賴於表A和A所依賴的所有表。
  • 表A設定為依賴於LEFT JOIN條件中使用的所有表(B除外)。
  • LEFT JOIN條件用於決定如何從表B中檢索行。(換句話說,不使用WHERE子句中的任何條件。)
  • 執行所有標準連線優化,但始終在所依賴的所有表之後讀取表。 如果存在迴圈依賴關係,則會發生錯誤。
  • 執行所有標準WHERE優化。
  • 如果A中有一行與WHERE子句匹配,但B中沒有與ON條件匹配的行,則會生成一個額外的B行,並將所有列設定為NULL。
  • 如果使用左聯接查詢某些表中不存在的行,則進行以下測試:在Where條件裡設定col_name is null,在表定義中col_name定義這列is not null,MySQL在找到與LEFT JOIN條件匹配的行後停止搜尋更多行(對於特定的鍵組合)。

RIGHT JOIN實現類似於LEFT JOIN的實現,表格角色顛倒過來。

對於LEFT JOIN,如果生成的空行的WHERE條件總是false,則將LEFT JOIN更改為inner join。則將左連線更改為內部聯接。例如,如果t2.column1為NULL,則WHERE子句在以下查詢中將為false:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

因此,將查詢轉換為inner join是安全的:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

現在優化器可以在表t1之前使用表t2,如果這樣做會導致更好的查詢計劃。