2016-04-21 79 views
0

假設我有一個連接的四個表,表1,並通過引用外鍵關係中的其他3個表(Table2,3,4):MySQL查詢優化通列的順序同步和WHERE子句條件

SELECT a.column_a, b.column_b, c.column_c, d.column_d 
FROM Table1 a, Table2 b, Table3 c, Table4 d 
WHERE a.col1_fk=d.col_id 
AND a.col2_fk=c.col_id 
AND a.col3_fk=b.col_id 

爲了對上述語句進行最佳優化,連接條件是否應與SELECT語句的列的順序相同?因此,我的示例是否至少優化了?或者是不重要的順序?

回答

2

這並不重要。查詢優化器決定首先讀取哪個表。
當數據量增大時,這可能也會改變。例如,有一天你的WHERE子句過濾了表的90%,所以MySQL決定首先讀這個表。一千個INSERT秒後,相同的WHERE子句可能只過濾1%。然後,MySQL可能會決定最後讀取它,甚至可能會執行全表掃描。

不要擔心這種優化。如果你想優化,閱讀EXPLAIN(它也顯示你讀取表的順序,除了是否使用了哪些索引)和learn to use indexes正確。

而且,沒有違規,你應該真正學到的是1992年ANSI SQL標準引入的正確的連接語法。Here就是一些例子。

+0

沒有冒犯 - 我知道你的意思是:INNER JOIN,OUTER JOIN等。也許有一天我會的。自1993年以來,我一直在使用SQL - 進出。舊的方式仍然適合我的加入。新方式似乎只能以更復雜的方式來做同樣的事情。 – Mikey

+0

關於索引,我知道所有參與WHERE子句的字段都應該被索引。這些是主鍵和外鍵,它們是。我知道EXPLAIN(解釋計劃),但我從來沒有用過 - 好奇。我會閱讀有關它。 – Mikey