2016-05-04 23 views
-1

我有2個表sl和sd。使用笛卡爾連接優化sql查詢

我想優化下面的查詢,如果有可能

select sl.*, sd.* from sl join sd where sl.conf_id='blah' and sd.for_as=1 

我的理解是,笛卡兒積是先執行,然後過濾發生。

是否有辦法先完成過濾?

+0

這兩張桌子有關係嗎? ..如果是在哪一列? – scaisEdge

+0

@scaisEdge上面的查詢中沒有包含2個表之間的關係。實際查詢是2個選擇的聯合,一個查詢在相關列上具有內連接,而在上面的問題中提到了後半部分。 我需要優化這一半。 –

+0

'我的理解是,首先執行笛卡爾積,然後過濾發生。'不,mysql通常可以優化它,反正 - 檢查執行計劃以確認實際正在進行的操作 –

回答

0

運行EXPLAIN SELECT ... - 它可能會說「使用連接緩衝區」。這是它將一張表加載到內存中(如果不是太大)並重復掃描它的數據。不是一個漂亮的網站,但比「加入緩衝區」發揮作用之前快了很多。

由於您沒有ONWHERE將兩張表綁在一起,您真的想要「交叉連接」嗎?也就是說,如果有40'blah'和70'1',你將以40 * 70 = 2800行結束?對於優化,優化器將選擇其中一個表,優先考慮具有有用索引的表,對其進行掃描(索引或表),然後重複使用連接緩衝區(如果可能)掃描(索引或表)的其他。

換句話說,如果可能的話,一個表將使用索引,在笛卡爾積之前進行過濾,另一個表可以使用連接緩衝區。如果桌子不太大,表演不會太差。