程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 對MySQL子查詢的簡略改寫優化

對MySQL子查詢的簡略改寫優化

編輯:MySQL綜合教程

對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之內。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved