記錄一次SQL慢查詢的排除過程

        首先,我們先自己定義一下花多少時間算慢查詢,我們使用show variables like "%long%";去查看mysql數據裏的long_query_time參數,系統默認是10秒,這是不可接受的慢,不過每個系統不一樣,就我的系統內部而言,超過0.5秒就可以當做慢查詢了。

        今天做系統巡查的時候發現一條查詢時間達到2.6秒的SQL,這是系統不能接受的,語句如下:

//字段名和表名非真實環境的,做了匿名轉換,用abcd等字母替代了
(
SELECT cs.a,cs.b,cs.c,cs.d,cs.e,cs.f,de.a FROM abcd cs LEFT 
JOIN efjh de 
ON de.b = cs.e 
WHERE 
cs.e = (SELECT e FROM efjh WHERE i = '490d74c5') 
AND cs.j = 1 
AND cs.h = 1 
ORDER BY cs.i 
DESC LIMIT 20
)

        上面的語句中de.a,對於結果集來講,每一行都是一樣的,那麼我們可以做的一個優化其實是提前把這個數據查詢出來,然後用程序把兩個數據做拼接即可,而不是使用連接查詢,修改後的語句爲:

1、先查詢de.a
(
SELECT a FROM efjh WHERE i = '490d74c5’
)
2、再查詢另一個表的其他數據
(
SELECT a,b,c,d,e,f FROM abcd cs 
WHERE e = (SELECT e FROM efjh WHERE i = '490d74c5’) 
AND j = 1 
AND h = 1 
ORDER BY i DESC LIMIT 20
)

         經過上述的優化發現時間降低到了1秒多,但是還是不滿足系統的需求,那麼還有什麼因素呢,SQL語句已經經過了優化了,接下來就開始從表裏開始找原因。

        查詢了表結構之後就立馬發現了慢的原因了,發現查詢條件中的e,j,h這三個字段沒有一個是加了索引的,這就是慢的根本原因,給這三個字段加上索引,再次執行SQL語句,發現執行時間立馬降低到了0.005秒左右。

        總結一下,以後遇到慢查詢,首先的第一反應應該是,查詢條件所使用的字段是否加了索引。

       下面來記錄一下分析慢查詢過程中用到的一些命令:

        1、查看一下慢查詢統計是不是已經開啓

       show variables like "%slow%";如果得到的結果中slow_query_log爲on,則代表開啓了。

       2、如果沒有開啓,如何去開啓慢查詢統計

       set global slow_query_log='ON';

       慢查詢日誌有兩種方式存儲,存儲在mysql.slow_log的表裏,或者存儲在主機名加_slow.log文件裏面。

 

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