《優(yōu)化案例 | 分區(qū)表場(chǎng)景下的SQL優(yōu)化》要點(diǎn):
本文介紹了優(yōu)化案例 | 分區(qū)表場(chǎng)景下的SQL優(yōu)化,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
有個(gè)表做了分區(qū),每天一個(gè)分區(qū).
該表上有個(gè)查詢,經(jīng)常只查詢表中某一天數(shù)據(jù),但每次都幾乎要掃描整個(gè)分區(qū)的所有數(shù)據(jù),有什么辦法進(jìn)行優(yōu)化嗎?
有一個(gè)大表,每天產(chǎn)生的數(shù)據(jù)量約100萬(wàn),所以就采用表分區(qū)方案,每天一個(gè)分區(qū).
下面是該表的DDL:
該表上經(jīng)常發(fā)生下面的慢查詢:
SELECT … FROM `t1` WHERE `date` = ‘2017-04-01’ AND `icnt` > 300 AND `id` = ‘801301’;
想要優(yōu)化一個(gè)SQL,一般來(lái)說(shuō)就是先看執(zhí)行計(jì)劃,觀察是否盡可能用到索引,同時(shí)要關(guān)注預(yù)計(jì)掃描的行數(shù),以及是否產(chǎn)生了臨時(shí)表(Using temporary)?或者?是否需要進(jìn)行排序(Using filesort),想辦法消除這些情況.
更進(jìn)一步的優(yōu)化策略則可能需要調(diào)整程序代碼邏輯,甚至技術(shù)架構(gòu)或者業(yè)務(wù)需求,這個(gè)動(dòng)作比較大,一般非核心系統(tǒng)上的核心問(wèn)題,不會(huì)這么大動(dòng)干戈,絕大多數(shù)情況,還是需要靠DBA盡可能發(fā)揮聰明才智來(lái)解決.
現(xiàn)在,我們來(lái)看下這個(gè)SQL的執(zhí)行計(jì)劃:
這個(gè)執(zhí)行計(jì)劃看起來(lái)還好,有索引可用,也沒(méi)臨時(shí)表,也沒(méi)filesort.不過(guò),我們也注意到,預(yù)計(jì)要掃描的行數(shù)還是挺多的?rows: 9384602,而且要掃描全部表分區(qū),難怪效率不高,總是SLOW QUERY.
我們注意到這個(gè)SQL總是要查詢某一天的數(shù)據(jù),這個(gè)表已經(jīng)做了按天分區(qū),那是不是可以忽略?WHERE 子句中的 時(shí)間條件呢?
還有,既然去掉了 date 條件,反觀表DDL,剩下的條件貌似就沒(méi)有合適的索引了吧?
所以,我們嘗試新建一個(gè)索引:
yejr@imysql.com[myDB]> ALTER TABLE t1 ADD INDEX iid (iid, icnt);
然后,把SQL改造成下面這樣,再看下執(zhí)行計(jì)劃:
這優(yōu)化效果,杠杠滴.
事實(shí)上,如果不強(qiáng)制指定分區(qū)的話,也是可以達(dá)到優(yōu)化效果的:
絕大多數(shù)的SQL通過(guò)添加索引、適當(dāng)調(diào)整SQL代碼(例如調(diào)整驅(qū)動(dòng)表順序)等簡(jiǎn)單手法來(lái)完成.
多說(shuō)幾句,遇到SQL優(yōu)化性能瓶頸問(wèn)題想要在技術(shù)群里請(qǐng)教時(shí),麻煩先提供幾個(gè)必要的信息:
原文來(lái)自微信公眾號(hào):老葉茶館
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4269.html