国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

對(duì)MySQL子查詢的簡(jiǎn)單改寫優(yōu)化

2024-07-24 12:46:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

使用過oracle或者其他關(guān)系數(shù)據(jù)庫(kù)的DBA或者開發(fā)人員都有這樣的經(jīng)驗(yàn),在子查詢上都認(rèn)為數(shù)據(jù)庫(kù)已經(jīng)做過優(yōu)化,能夠很好的選擇驅(qū)動(dòng)表執(zhí)行,然后在把該經(jīng)驗(yàn)移植到mysql數(shù)據(jù)庫(kù)上,但是不幸的是,mysql在子查詢的處理上有可能會(huì)讓你大失所望,在我們的生產(chǎn)系統(tǒng)上就由于碰到了這個(gè)問題:

select i_id, sum(i_sell) as i_sellfrom table_datawhere i_id in (select i_id from table_data where Gmt_create >= '2011-10-07 00:00:00′)group by i_id;

(備注:sql的業(yè)務(wù)邏輯可以打個(gè)比方:先查詢出10-07號(hào)新賣出的100本書,然后在查詢這新賣出的100本書在全年的銷量情況)。

這條sql之所以出現(xiàn)的性能問題在于mysql優(yōu)化器在處理子查詢的弱點(diǎn),mysql優(yōu)化器在處理子查詢的時(shí)候,會(huì)將將子查詢改寫。通常情況下,我們希望由內(nèi)到外,先完成子查詢的結(jié)果,然后在用子查詢來(lái)驅(qū)動(dòng)外查詢的表,完成查詢;但是mysql處理為將會(huì)先掃描外面表中的所有數(shù)據(jù),每條數(shù)據(jù)將會(huì)傳到子查詢中與子查詢關(guān)聯(lián),如果外表很大的話,那么性能上將會(huì)出現(xiàn)問題;

針對(duì)上面的查詢,由于table_data這張表的數(shù)據(jù)有70W的數(shù)據(jù),同時(shí)子查詢中的數(shù)據(jù)較多,有大量是重復(fù)的,這樣就需要關(guān)聯(lián)近70W次,大量的關(guān)聯(lián)導(dǎo)致這條sql執(zhí)行了幾個(gè)小時(shí)也沒有執(zhí)行完成,所以我們需要改寫sql:

SELECT t2.i_id, SUM(t2.i_sell) AS soldFROM (SELECT distinct i_id FROM table_dataWHERE gmt_create >= '2011-10-07 00:00:00′) t1, table_data t2WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;

我們將子查詢改為了關(guān)聯(lián),同時(shí)在子查詢中加上distinct,減少t1關(guān)聯(lián)t2的次數(shù);

改造后,sql的執(zhí)行時(shí)間降到100ms以內(nèi)。

您可能感興趣的文章:

mysql關(guān)聯(lián)子查詢的一種優(yōu)化方法分析MySQL中表子查詢與關(guān)聯(lián)子查詢的基礎(chǔ)學(xué)習(xí)教程MySQL的子查詢中FROM和EXISTS子句的使用教程詳解MySql基本查詢、連接查詢、子查詢、正則表達(dá)查詢MYSQL子查詢和嵌套查詢優(yōu)化實(shí)例解析
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黑龙江省| 古交市| 项城市| 马公市| 昌平区| 遂昌县| 吴桥县| 蒲江县| 双鸭山市| 商洛市| 新宁县| 汉川市| 疏勒县| 抚宁县| 英吉沙县| 专栏| 璧山县| 北流市| 资溪县| 宜兴市| 岚皋县| 永城市| 梅河口市| 大新县| 加查县| 苏尼特右旗| 邹平县| 富平县| 新竹县| 棋牌| 银川市| 闻喜县| 栖霞市| 垦利县| 清徐县| 绥江县| 怀远县| 兴业县| 湟中县| 金山区| 铅山县|