MYSQL UNION 笛卡爾積
- 想必寫這句
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條件去過渡,可以說大大降低了性能。
- 現在我們來談一談 怎樣避免
(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條件中再去過濾數據。