記一次mysql慢查詢優化

問題背景

線上監控發現mysql慢查詢,mysql最大執行時間60s,接口p99耗時1.88s

優化記錄

檢查索引

show create table xxx

線上query條件比較複雜,有接近10個查詢字段,主要字段都已經加索引

檢查索引順序

explain select x from x where 1=1  and xxx and xxx2 order by x limit x offet x

抓取log中的慢查詢sql,發現已經命中索引,並且sql中無複雜計算,索引條件生效,過濾數據從百萬減少到千級
sql中的1=1是爲了方便拼接where條件,防止where空查詢

進一步定位

將where條件拆分排列組合,發現加了sort by id後導致查詢很慢
檢查表內容,發現有一個text字段特別大,

檢查mysql排序變量大小

show VARIABLES like '%sort%'

其中 sort_buffer_size=262144,初步定位問題是字段太大,排序緩衝太小,導致排序變慢

sort_buffer_size:是MySql執行排序使用的緩衝大小。 如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。 如果不能,可以嘗試增加sort_buffer_size變量的大小。 read_rnd_buffer_size:是MySql的隨機讀緩衝區大小。

優化

修改sql條件,先查id再查具體的內容,只通過id過濾可以減少排序緩衝佔用,另外也可以增加 sort_buffer_size 大小

select x from x where id in (select id from x where xxx limit x offer x)

結果

接口p99和avg從1.8s減少到900ms,優化 50%+

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章