首先,我們先自己定義一下花多少時間算慢查詢,我們使用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文件裏面。