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

首頁 > 數據庫 > MySQL > 正文

對MySQL子查詢的簡單改寫優(yōu)化

2020-01-18 22:56:37
字體:
來源:轉載
供稿:網友

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

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è)務邏輯可以打個比方:先查詢出10-07號新賣出的100本書,然后在查詢這新賣出的100本書在全年的銷量情況)。

這條sql之所以出現的性能問題在于mysql優(yōu)化器在處理子查詢的弱點,mysql優(yōu)化器在處理子查詢的時候,會將將子查詢改寫。通常情況下,我們希望由內到外,先完成子查詢的結果,然后在用子查詢來驅動外查詢的表,完成查詢;但是mysql處理為將會先掃描外面表中的所有數據,每條數據將會傳到子查詢中與子查詢關聯,如果外表很大的話,那么性能上將會出現問題;

針對上面的查詢,由于table_data這張表的數據有70W的數據,同時子查詢中的數據較多,有大量是重復的,這樣就需要關聯近70W次,大量的關聯導致這條sql執(zhí)行了幾個小時也沒有執(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;

我們將子查詢改為了關聯,同時在子查詢中加上distinct,減少t1關聯t2的次數;

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 含山县| 军事| 丘北县| 乌恰县| 蛟河市| 齐齐哈尔市| 晋中市| 凤冈县| 特克斯县| 龙岩市| 永安市| 铜梁县| 郴州市| 绥中县| 岐山县| 尉犁县| 霍山县| 镇远县| 永丰县| 广西| 安溪县| 江油市| 鄂温| 南澳县| 织金县| 梅河口市| 汉寿县| 定安县| 巧家县| 正安县| 永定县| 邯郸市| 汾西县| 湖州市| 新竹县| 清流县| 江阴市| 宣恩县| 阳东县| 安宁市| 阳东县|