華為云計(jì)算 云知識 【云小課】如何查看和優(yōu)化慢SQL
【云小課】如何查看和優(yōu)化慢SQL

云小課必用.png

慢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 

1.png

原因分析:通過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í)行速度大幅提升。