慢SQL產(chǎn)生的主要原因有SQL編寫問題、鎖等待、業(yè)務(wù)實(shí)例相互干擾對IO/CPU資源征用和服務(wù)器硬件等。在業(yè)務(wù)運(yùn)行中,由于SQL編寫導(dǎo)致的慢SQL的概率最大,故著重從SQL編寫的優(yōu)化入手,并結(jié)合具體案例進(jìn)行說明。
如何查看慢SQL
1. 登錄管理控制臺。
2. 單擊管理控制臺左上角的圖標(biāo),選擇區(qū)域和項(xiàng)目。
3. 在頁面左上角單擊圖標(biāo),選擇“ 數(shù)據(jù)庫 > 云數(shù)據(jù)庫 GaussDB”。進(jìn)入云數(shù)據(jù)庫GaussDB控制臺,在左側(cè)導(dǎo)航欄選擇“GaussDB(for MySQL)”。
4. 在“實(shí)例管理”頁面,選擇目標(biāo)實(shí)例,單擊實(shí)例名稱,進(jìn)入“基本信息”頁面。
5. 在左側(cè)導(dǎo)航樹,單擊“日志管理”。
6. 選擇“慢日志”頁簽,查看慢SQL語句的詳細(xì)信息。慢日志功能支持查看指定執(zhí)行語句類型或時(shí)間段的慢日志記錄。
如何進(jìn)行慢SQL優(yōu)化
本部分從SQL編寫角度介紹慢SQL可進(jìn)行的優(yōu)化。
1. 字段類型轉(zhuǎn)換導(dǎo)致不用索引,如字符串類型的不用引號,數(shù)字類型的用引號等,這有可能會用不到索引導(dǎo)致全表被掃描。
2. mysql不支持函數(shù)轉(zhuǎn)換,所以字段前面不能加函數(shù),否則將用不到索引。
3. 不要在字段前面加減運(yùn)算。
4. 字符串比較長的可以考慮索引一部分減少索引文件大小,提高寫入效率。
5. like %在前面用不到索引。
6. 根據(jù)聯(lián)合索引的第二個(gè)及以后的字段單獨(dú)查詢用不到索引。
7. 不要使用select *。
8. 排序請盡量使用升序。
9. or的查詢盡量用union代替(Innodb)。
10. 復(fù)合索引高選擇性的字段排在前面。
11. order by/group by字段包括在索引當(dāng)中減少排序,效率會更高。
慢SQL優(yōu)化典型案例
本部分以“mysql不支持函數(shù)轉(zhuǎn)換,所以字段前面不能加函數(shù),否則將用不到索引”優(yōu)化點(diǎn)為例舉例說明。
原SQL語句:
SELECT id,title,most_top,view_count,posttime
FROM article where status=3
AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17) and
DATEDIFF(NOW(),posttime)<=90 order by most_top desc,posttime desc limit 0,8
原因分析:通過explain可以看出來這個(gè)語句執(zhí)行慢是因?yàn)閍riticle表掃描了27298行,并進(jìn)行了排序。
優(yōu)化步驟:
1. 初步優(yōu)化,對數(shù)據(jù)量進(jìn)行限制。將原SQL語句修改為:
SELECT id,title,most_top,view_count,posttime
FROM article where status=3
AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17) and
DATEDIFF(NOW(),posttime)<=90 order by most_top desc,posttime desc limit 0,8
發(fā)現(xiàn)進(jìn)行限制時(shí)間后并沒有大幅度的提高。原因每次使用datediff運(yùn)算導(dǎo)致不走索引即慢SQL優(yōu)化點(diǎn)的第二條。
2. 繼續(xù)修改,修改為:
SELECT id,title,most_top,view_count,posttime
FROM article where status=3
AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17) and
postime>='2017-09-05' order by most_top desc,posttime desc limit 0,8
重新執(zhí)行SQL后,SQL執(zhí)行速度大幅提升。