監(jiān)控系統(tǒng)監(jiān)控到我們的程序變慢了,懷疑是sql的原因,要怎么去分析排查呢?一般按照如下幾個步驟進行:
本文先來講講慢查日志。
1. 是什么?
MySQL慢查日志是一種記錄執(zhí)行很慢的sql的日志。MySQL中可以通過long_query_time
來設置一個閥值,如果執(zhí)行時間超過這個閥值,就會被認為是慢sql,就會記錄到慢查日志中。該閥值默認是10s,即執(zhí)行超過10s的sql就會被記錄。
2. 怎么用?
MySQL默認是沒有開啟慢查日志的,如果不是調優(yōu)需要的話,不建議開啟,因為這個也會帶來性能的影響。執(zhí)行以下sql可以查詢是否開啟慢查日志以及慢查日志的路徑:
show variables like '%slow_query_log%';
可以看到默認是off的。執(zhí)行以下sql即可開啟:
set global slow_query_log = 1;
可以看到,已經變成on了,也就是開啟了。不過這樣設置并不是永久生效,重啟后就失效了,如果要永久生效,就得修改MySQL的配置文件my.cnf
,在[mysqld]
下增加如下配置:
slow_query_log=1
slow_query_log_file=/var/lib/mysql/sql-slow.log
long_query_time=3
log_output=FILE
增加了這兩行配置后,重啟MySQL就可以了。
執(zhí)行如下sql可以查看當前設置的閥值:
show variables like 'long_query_time';
可以看到,當前設置的是10秒。要大于10s才會觸發(fā),等于是不會觸發(fā)的。但是10s這個閥值太大了,我們一般會改小一點,通過以下sql可以修改該值:
set long_query_time = 3;
那么我們要怎么驗證修改是否生效呢?也就是超過3s的sql到底有沒有被記錄到慢查日志中呢?執(zhí)行如下sql:
select sleep(4);
這條sql就要睡4秒之后才會執(zhí)行,所以最少都要執(zhí)行4秒多,我們設置的閥值是3秒,所以肯定會被記錄。
剛才查看了知道慢查日志名字叫localhost-slow.log
,那么到底在哪個目錄下?可以通過執(zhí)行如下命令來查找:
find / -name "localhost-slow.log"
我們cat一下這個文件,看看剛剛執(zhí)行的select sleep(4)
到底有沒有被記錄,結果如下:
可以看到,確實生效了,sql被記錄到了慢查日志中。
我們還可以通過執(zhí)行如下語句,來查詢當前有多少條慢sql:
show global status like "%Slow_queries%";
生產環(huán)境可能會出現很多的慢查日志,如果都要手工分析,也是比較費時的,MySQL提供了慢查日志分析工具,mysqldumpslow。
執(zhí)行如下命令可以查看幫助文檔:
mysqldumpslow --help
常見命令如下:
# 得到返回記錄集最多的10個sql
mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log
# 得到訪問次數最多的10個sql
mysqldumpslow -s c -t 10 /var/lib/mysql/localhost-slow.log
# 得到按照時間排序的前10條里面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow.log
# 一般執(zhí)行上面的語句都要和 | more 一起使用,否則爆屏
mysqldumpslow -s r -t 10 /var/lib/mysql/local
掃描二維碼
聯系客服