原文鏈接:https://www.caituotuo.top/c56bd0c5.html 0. 前言 假設一次執行20條SQL,我們如何判斷哪條SQL是執行慢的爛SQL,這裡就需要用到慢查詢日誌。 在SQL中,廣義的查詢就是crud操作,而狹義的查詢僅僅是select查詢操作,慢查詢指的是廣義的查詢 ...
原文鏈接:https://www.caituotuo.top/c56bd0c5.html
0. 前言
假設一次執行20條SQL,我們如何判斷哪條SQL是執行慢的爛SQL,這裡就需要用到慢查詢日誌
。
在SQL中,廣義的查詢就是crud操作,而狹義的查詢僅僅是select查詢操作,慢查詢指的是廣義的查詢,包括增刪改查,一般是查詢,所以稱為慢查詢。
1. 什麼是慢查詢日誌?
MySQL提供的一種日誌記錄,用於記錄MySQL中響應時間超過閾值[yù zhí]
的SQL語句(long_query_time,預設10秒)
慢查詢日誌預設是關閉的,開啟會消耗一定的性能,一般是開發調優時打開,而部署時會關閉。
2. 檢查是否開啟了慢查詢日誌
執行語句:
show variables like '%slow_query_log';
預設是OFF關閉狀態
3. 如何開啟慢查詢日誌?
有兩種開啟方式,臨時開啟
和永久開啟
。
3.1 臨時開啟
一般使用臨時開啟,即在記憶體中開啟,MySQL退出就自動關閉。
set global slow_query_log = 1;
set global slow_query_log_file="D:/MySQL Server 5.5/slow_query_log.log";
臨時開啟,重啟MySQL服務會變成OFF狀態
Linux:
service mysql restart
Windows:
右擊開始菜單——電腦管理——找到MySQL服務——重啟:
重啟後的可以看到變成關閉狀態:
3.2 永久開啟
修改配置文件
Linux:/etc/my.cnf 中追加配置
vi /etc/my.cnf
[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/localhost-slow-query-log.log
Windows:D:\MySQL Server 5.5\my.ini
[mysqld]
slow_query_log=1
slow_query_log_file="D:/MySQL Server 5.5/slow_query_log.log"
4. 慢查詢閾值修改
4.1 查看預設值
show variables like '%long_query_time%';
4.2 臨時設置閾值
設置完畢後,需要重新登錄MySQL才能生效(註意是重新登錄MySQL,不是重啟MySQL服務)
set global long_query_time = 5;
4.3 永久設置閾值
配置文件,修改完成後需要重啟MySQL服務
[mysqld]
long_query_time=3
5. 慢SQL排查測試
5.1 模擬慢SQL數據
執行如下SQL語句休眠4秒,模擬慢SQL:
select sleep(4);
查詢超過閾值的SQL的數量:
show global status like '%slow_queries%';
5.2 查詢超過閾值的具體SQL語句
- 通過查看日誌文件,也就是前面設置的slow_query_log_file:
- 通過mysqldumpslow工具查看慢SQL
作用:假設執行了1000條SQL,其中有30條SQL都超過了閾值,如果直接查看日誌文件,無法快速定位到具體的SQL,因此mysqldumpslow可以通過一些過濾條件,快速查找出需要定位的慢SQL。
Linux:
mysqldumpslow命令
查看幫助文檔:
mysqldumpslow --help
-s ORDER排序 what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count(訪問次數)
l: lock time(鎖的時間)
r: rows sent(返回的記錄數)
t: query time(查詢時間)
-r:逆序 reverse the sort order (largest last instead of first)
-l:鎖定時間 don't subtract lock time from total time
-g:後面跟一個正則匹配模式,大小寫不敏感
-t:top n,即為返回前面多少條的數據
例子:
-
獲取返回記錄最多的3個SQL
mysqldumpslow -s r -t 3 /var/lib/mysql/localhost-slow-query-log.log
-
獲取訪問次數最多的3個SQL
mysqldumpslow -s c -t 3 /var/lib/mysql/localhost-slow-query-log.log
-
按照時間排序,前10條包含left join查詢語句的SQL
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow-query-log.log
Windows:
MySQL安裝後以後在bin下有mysqldumpslow.pl文件,如果沒有可以自行下載
D:\MySQL Server 5.5\bin\mysqldumpslow.pl
mysqldumpslow是一個perl腳本,要想在Windows執行,首先需要安裝Perl
安裝過程很簡單,從官網 http://strawberryperl.com/ 下載windows安裝包,安裝完成後通過perl -v
命令測試是否安裝成功,如果能顯示版本號,表示安裝成功。
百度網盤:
鏈接:https://pan.baidu.com/s/1MiJ3FNUGEoSE1U6dJzOsAg
提取碼:slt7
查看幫助文檔:
perl mysqldumpslow.pl --help
例子:
-
獲取返回記錄最多的3個SQL
perl mysqldumpslow.pl -s r -t 3 "D:/MySQL Server 5.5/slow_query_log.log"
-
獲取訪問次數最多的3個SQL
perl mysqldumpslow.pl -s c -t 3 "D:/MySQL Server 5.5/slow_query_log.log"
-
按照時間排序,前10條包含left join查詢語句的SQL
perl mysqldumpslow.pl -s t -t 10 -g "left join" "D:/MySQL Server 5.5/slow_query_log.log"