MYSQL UNION 笛卡爾積

MYSQL UNION 笛卡爾積

  1. 想必寫這句
select * from tablea ,tableb where tablea.id = tableb.id 

肯定有人寫過無數次了吧,肯定還是有人會這樣寫,並且依然沒有看出問題,select * from tablea,tableb 其實可以首先執行這句sql就能發現出現的結果是tablea的每個記錄和table中的所有記錄都生成一條記錄。也就是假如tablea有四條記錄,tableb有五條記錄,最後會首先生成20條記錄。回到開頭的sql,再用where 條件去過濾內容,想必大多數人覺得也沒啥問題,這個問題在數據量不大的時候,確實沒啥問題,但是到了比如表A中有1w數據,表B中有1w數據,這樣的會就會產生1億的數據,然後再用where條件去過渡,可以說大大降低了性能。

  1. 現在我們來談一談 怎樣避免
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

在每條union 之前的sql中加上過濾條件即可;也可以用是join on

select * from tablea join tableb on tablea.id=tableb.id

這樣的話會按照on中的條件,來連接兩條數據,大大減少了需要排除的數據,然後可以在where條件中再去過濾數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章