數據庫-子查詢《mysql子查詢的弱點》

資料庫-子查詢《mysql子查詢的弱點》,mysql的子查詢的優化不是很友好,一直有受業界批評比較多。

關於mysql的查詢有兩個知識點:

1.第一個為mysql在處理所有的查詢的時候都強行轉換為聯接來執行,將每個查詢包括多表中關聯匹配,關聯
子查詢,union,甚至單表的的查詢都處理為聯接,接著mysql執行聯接,把每個聯接在處理為一個嵌套循環
(oracle-nest-loop);

2.在mysql在處理子查詢的時候,會將將子查詢改寫,通常情況下,我們希望由內到外,先完成子查詢的結果,
然後在用子查詢來驅動外查詢的表,完成查詢。例如:Select * from test where test_id in
(select fk_test_id from sub_test where group_id=10)通常我們會想到該sql的執行順序為:

這裡寫圖片描述

sub_test表中根據group_id取得fk_test_id(2,3,4,5,6),然後在到test中,帶入test_id=2,3,4,5,6
取得查詢數據,但是實際mysql的處理方式為:Select * from test where exists (select * from 
sub_test where group_id=10 and sub_test.test_id=test.id)。mysql將會掃描test中的所有數據,
每條數據將會傳到子查詢中與sub_test關聯,子查詢不能首先被執行,如果test表很大的話,那麼性能上將會
出現問題;       

這時候就需要改寫查詢瞭:select t1.* from test t1,(select fk_test_id from sub_test where 
group_id=10) t2 where t1.test_id=t2.fk_test_id ;

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *