|
監(jiān)控系統(tǒng)監(jiān)控到我們的程序變慢了,懷疑是sql的原因,要怎么去分析排查呢?一般按照如下幾個(gè)步驟進(jìn)行: - 開(kāi)啟慢查詢?nèi)罩荆O(shè)置閥值,將慢sql從日志中抓取出來(lái);
- show profile,查詢sql的執(zhí)行細(xì)節(jié)和生命周期情況;
- MySQL數(shù)據(jù)庫(kù)參數(shù)調(diào)優(yōu)。
本文先來(lái)講講慢查日志。 1. 是什么? MySQL慢查日志是一種記錄執(zhí)行很慢的sql的日志。MySQL中可以通過(guò)long_query_time來(lái)設(shè)置一個(gè)閥值,如果執(zhí)行時(shí)間超過(guò)這個(gè)閥值,就會(huì)被認(rèn)為是慢sql,就會(huì)記錄到慢查日志中。該閥值默認(rèn)是10s,即執(zhí)行超過(guò)10s的sql就會(huì)被記錄。 2. 怎么用? MySQL默認(rèn)是沒(méi)有開(kāi)啟慢查日志的,如果不是調(diào)優(yōu)需要的話,不建議開(kāi)啟,因?yàn)檫@個(gè)也會(huì)帶來(lái)性能的影響。執(zhí)行以下sql可以查詢是否開(kāi)啟慢查日志以及慢查日志的路徑: show variables like '%slow_query_log%';
執(zhí)行結(jié)果可以看到默認(rèn)是off的。執(zhí)行以下sql即可開(kāi)啟: set global slow_query_log = 1;
執(zhí)行結(jié)果可以看到,已經(jīng)變成on了,也就是開(kāi)啟了。不過(guò)這樣設(shè)置并不是永久生效,重啟后就失效了,如果要永久生效,就得修改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可以查看當(dāng)前設(shè)置的閥值: show variables like 'long_query_time';
執(zhí)行結(jié)果可以看到,當(dāng)前設(shè)置的是10秒。要大于10s才會(huì)觸發(fā),等于是不會(huì)觸發(fā)的。但是10s這個(gè)閥值太大了,我們一般會(huì)改小一點(diǎn),通過(guò)以下sql可以修改該值: set long_query_time = 3;
執(zhí)行結(jié)果那么我們要怎么驗(yàn)證修改是否生效呢?也就是超過(guò)3s的sql到底有沒(méi)有被記錄到慢查日志中呢?執(zhí)行如下sql: select sleep(4);
這條sql就要睡4秒之后才會(huì)執(zhí)行,所以最少都要執(zhí)行4秒多,我們?cè)O(shè)置的閥值是3秒,所以肯定會(huì)被記錄。 剛才查看了知道慢查日志名字叫localhost-slow.log,那么到底在哪個(gè)目錄下?可以通過(guò)執(zhí)行如下命令來(lái)查找: find / -name "localhost-slow.log"
執(zhí)行結(jié)果我們cat一下這個(gè)文件,看看剛剛執(zhí)行的select sleep(4)到底有沒(méi)有被記錄,結(jié)果如下: 執(zhí)行結(jié)果可以看到,確實(shí)生效了,sql被記錄到了慢查日志中。 我們還可以通過(guò)執(zhí)行如下語(yǔ)句,來(lái)查詢當(dāng)前有多少條慢sql: show global status like "%Slow_queries%";
執(zhí)行結(jié)果生產(chǎn)環(huán)境可能會(huì)出現(xiàn)很多的慢查日志,如果都要手工分析,也是比較費(fèi)時(shí)的,MySQL提供了慢查日志分析工具,mysqldumpslow。 執(zhí)行如下命令可以查看幫助文檔: mysqldumpslow --help
幫助文檔常見(jiàn)命令如下: # 得到返回記錄集最多的10個(gè)sql mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log
# 得到訪問(wèn)次數(shù)最多的10個(gè)sql mysqldumpslow -s c -t 10 /var/lib/mysql/localhost-slow.log
# 得到按照時(shí)間排序的前10條里面含有左連接的查詢語(yǔ)句 mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow.log
# 一般執(zhí)行上面的語(yǔ)句都要和 | more 一起使用,否則爆屏 mysqldumpslow -s r -t 10 /var/lib/mysql/local
|