序言: 在我面試很多人的過程中,很多人談到SQL優化都頭頭是道,建索引,explain 分析,like 全模糊會導致索引失效 雲雲,於是我問道:優化之前,需要找出數據庫中比如超過2s的慢SQL,你是怎么找的?很多人答不上來,要是找都找不到,怎么去優化呢,一個中大型系統可能成千上萬條SQL都不過分,難道要一個個去分析么。
所以今天和大家聊聊 慢SQL的挖掘機-慢查詢日志
慢查詢日志
MySQL的慢查詢日志是MySQL提供的一種日志記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過 long_query_time
值的SQL,則會被記錄到慢查詢日志中。
當然,如果不是調優需要的話,一般不建議啟動該參數,因為開啟慢查詢日志會或多或少帶來一定的性能影響。
1. 慢查詢日志開啟
- 查看是否開啟: show variables like '%slow_query_log%';
- 開啟慢查詢日志:set global slow_query_log=1; (重啟會失效)
開啟了慢查詢日志后,什么樣的SQL才會記錄到查詢日志里面?
這個是由參數 long_query_time
控制,默認情況下 long_query_time
的值為10秒
查看命令: show variables like 'long_query_time%';
注: 永久設置慢查詢日志開啟,以及設置慢查詢日志時間臨界點(不建議)
linux中,mysql配置文件一般默認在 /etc/my.cnf 更改對應參數即可
2. 慢查詢日志設置與查看
設置閥值命令: set global long_query_time=3 (修改為閥值到3秒鍾的就是慢sql)
為什么設置后看不出變化:
- 需要重新連接或新開一個會話才能看到修改值。 show variables like 'long_query_time%';
- 直接 show global variables like 'long_query_time';
查看慢查詢日志:
cat -n /data/mysql/mysql-slow.log
從慢查詢日志中,我們可以看到每一條查詢時間高於3s 的sql語句,並可以看到執行的時間是多少。
比如上面,就表示 sql語句 select * from comic where comic_id < 1952000; 執行時間為3.902864秒,超出了我們設置的慢查詢時間臨界點3s,所以被記錄下來了
查看有多少條慢查詢記錄: show global status like '%Slow_queries%';
3. 日志分析工具mysqldumpslow
在生產環境中,如果要手工分析日志,查找、分析SQL,顯然是個體力活,MySQL提供了日志分析工具 mysqldumpslow
- s: 是表示按照何種方式排序
- c: 訪問次數
- l: 鎖定時間
- r: 返回記錄
- t: 查詢時間
- al:平均鎖定時間
- ar:平均返回記錄數
- at:平均查詢時間
- t:即為返回前面多少條的數據
- g:后邊搭配一個正則匹配模式,大小寫不敏感的
工作常用參考:
-
得到返回記錄集最多的10個SQL: mysqldumpslow -s r -t 10 /var/lib/mysql/mysql-slow.log
-
得到訪問次數最多的10個SQL: mysqldumpslow -s c -t 10 /var/lib/mysql/mysql-slow.log
-
得到按照時間排序的前10條里面含有左連接的SQL: mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/mysql-slow.log
建議:為方便 可以結合 | 和 more 使用,否則可能出現爆屏
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more