慢查詢日志
查看執行慢的SQL語句,需要先開啟慢查詢日志。
MySQL 的慢查詢日志,記錄在 MySQL 中響應時間超過閥值的語句(具體指運行時間超過?long_query_time
?值的SQL。long_query_time 的默認值為10,意思是運行10秒以上(不含10秒)的語句)。
目的:發現執行時間特別長的SQL查詢,進行優化。
默認情況下,MySQL數據庫沒有開啟慢查詢日志,需要我們手動來設置這個參數。
慢日志常用配置項
1 2 3 4 5 6 7 8 | slow_query_log?????? 是否啟用慢查詢日志,默認為0,可設置為0、1,1表示開啟。 slow_query_log_file? 指定慢查詢日志位置及名稱,默認值為host_name-slow.log,可指定絕對路徑。 long_query_time????? 慢查詢執行時間閾值,超過此時間會記錄,默認為10,單位為s。 log_output?????????? 慢查詢日志輸出目標,默認為file,即輸出到文件。 log_timestamps?????? 主要是控制 error log、slow log、genera log 日志文件中的顯示時區,默認使用UTC時區,建議改為 SYSTEM 系統時區。 log_queries_not_using_indexes??? 是否記錄所有未使用索引的查詢語句,默認為off。 min_examined_row_limit?????????? 對于查詢掃描行數小于此參數的SQL,將不會記錄到慢查詢日志中,默認為0。 log_slow_admin_statements??????? 慢速管理語句是否寫入慢日志中,管理語句包含 alter table、create index 等,默認為 off 即不寫入 |
一般情況下,我們只需開啟慢日志記錄,配置下閾值時間,其余參數可按默認配置。對于閾值時間,可靈活調整,比如說可以設置為 1s 或 3s 。
查看是否開啟慢查詢日志
1 | show variables like '%slow_query_log%' ; |
開啟慢查詢(臨時,當前會話有效)
1 | set global slow_query_log= 'ON' ; |
查看慢查詢日志存放文件位置
1 | show variables like '%slow_query_log_file%' ; |
查看long_query_time閾值
1 | show variables like '%long_query_time%' ; |
設置long_query_time閾值(臨時,當前會話有效)
1 | set global long_query_time=3 |
直接修改配置文件(全局,需要重啟服務,慎重)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #編輯配置文件 vim /etc/my.cnf # 修改配置項(如果沒有就加上) [mysqld] slow_query_log = ON slow_query_log_file = /var/lib/mysql/my-slow.log long_query_time = 1 log_timestamps = SYSTEM log_output = FILE # 重啟mysqld服務 systemctl restart mysqld # 查看mysqld服務 systemctl status mysqld |
測試
1 2 | select sleep(5); ls /var/lib/mysql/xxx-slow.log |
慢查詢日志文件分析
單條記錄結構
單條記錄結構:
1 2 3 4 5 | # Time : 2024-03-01T17:12:40.156488+08:00 # User @Host: panda[panda] @? [192.168.72.1]? Id:???? 8 # Query_time: 5.000688? Lock_time: 0.000000 Rows_sent: 1? Rows_examined: 1 SET timestamp =1709284355; select sleep(5); |
字段說明:
慢查詢日志以#作為起始符。
Time:查詢的時間。
User@Host:表示用戶 和 慢查詢查詢的ip地址。
如上所述,表示 root用戶 localhost地址。
Query_time: 表示SQL查詢持續時間, 單位 (秒)。
Lock_time: 表示獲取鎖的時間, 單位(秒)。
Rows_sent: 表示發送給客戶端的行數。
Rows_examined: 表示:服務器層檢查的行數。
set timestamp :表示 慢SQL 記錄時的時間戳。
最后 select sleep(5) 則表示慢SQL語句。
慢查詢日志分析-mysqldumpslow
MySQL自帶了一個慢查詢分析工具mysqldumpslow。
試了下不太好使。可以試試:
Navicat Monitor、signoz、hertzbeat 這些性能監測工具。
1 2 3 4 | mysqldumpslow -s c -t 10 /var/run/mysqld/mysqld-slow.log # 取出使用最多的10條慢查詢 mysqldumpslow -s t -t 3 /var/run/mysqld/mysqld-slow.log # 取出查詢時間最慢的3條慢查詢 mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log #得到按照時間排序的前10條里面含有左連接的查詢語句 mysqldumpslow -s r -t 10 -g 'left join' /var/run/mysqld/mysqldslow.log # 按照掃描行數最多的 |
慢查詢日志分析-Navicat Monitor
官網下載就行了。跟著指引配置即可。
很舒服,還可以自動提供一些運維建議。

查詢分析

其他細節
記錄管理語句
在 MySQL 中,慢查詢日志中默認不記錄管理語句,如:
1 | alter table , analyze table , check table |
不過可通過以下屬性進行設置:
1 | mysql> set global log_slow_admin_statements = "ON" ; |
記錄未走索引的SQL語句
在 MySQL 中,還可以設置將未走索引的SQL語句記錄在慢日志查詢文件中(默認為關閉狀態)。通過下述屬性即可進行設置:
1 2 | mysql> set global log_queries_not_using_indexes = "ON" ; Query OK, 0 rows affected (0.00 sec) |
SQL 復制 全屏
慢查詢日志輸出位置
在MySQL中,日志輸出格式有支持:FILE(默認),TABLE 兩種,可進行組合使用。如下所示:
1 | set global log_output = "FILE,TABLE" ; |
這樣設置會同時在 FILE, mysql庫中的slow_log表中同時寫入。
1 | select * from mysql.slow_log; |