1. 程式人生 > 其它 >記一次mysql慢查詢優化

記一次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%+

時間會記錄下一切。