對MySQL子查詢的簡略改寫優化。本站提示廣大學習愛好者:(對MySQL子查詢的簡略改寫優化)文章只能為提供參考,不一定能成為您想要的結果。以下是對MySQL子查詢的簡略改寫優化正文
應用過oracle或許其他關系數據庫的DBA或許開辟人員都有如許的經歷,在子查詢上都以為數據庫曾經做過優化,可以或許很好的選擇驅動表履行,然後在把該經歷移植到mysql數據庫上,然則不幸的是,mysql在子查詢的處置上有能夠會讓你年夜掉所望,在我們的臨盆體系上就因為碰著了這個成績:
select i_id, sum(i_sell) as i_sell from table_data where i_id in (select i_id from table_data where Gmt_create >= '2011-10-07 00:00:00′) group by i_id;
(備注:sql的營業邏輯可以打個比喻:先查詢出10-07號新賣出的100本書,然後在查詢這新賣出的100本書在全年的銷量情形)。
這條sql之所以湧現的機能成績在於mysql優化器在處置子查詢的弱點,mysql優化器在處置子查詢的時刻,會將將子查詢改寫。平日情形下,我們願望由內到外,先完成子查詢的成果,然後在用子查詢來驅動外查詢的表,完成查詢;然則mysql處置為將會先掃描裡面表中的一切數據,每條數據將會傳到子查詢中與子查詢聯系關系,假如表面很年夜的話,那末機能大將會湧現成績;
針對下面的查詢,因為table_data這張表的數據有70W的數據,同時子查詢中的數據較多,有年夜量是反復的,如許就須要聯系關系近70W次,年夜量的聯系關系招致這條sql履行了幾個小時也沒有履行完成,所以我們須要改寫sql:
SELECT t2.i_id, SUM(t2.i_sell) AS sold FROM (SELECT distinct i_id FROM table_data WHERE gmt_create >= '2011-10-07 00:00:00′) t1, table_data t2 WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;
我們將子查詢改成了聯系關系,同時在子查詢中加上distinct,削減t1聯系關系t2的次數;
改革後,sql的履行時光降到100ms之內。