記錄執行時間超過 long_query_time 的 SQL,幫助定位效能瓶頸、優化索引、改寫查詢。
| 參數 | 預設值 | 建議值 | 說明 |
|---|---|---|---|
slow_query_log | OFF | ON | 總開關 |
slow_query_log_file | host-slow.log | /var/log/mysql/slow.log | 日誌路徑 (需 mysql 寫入權限) |
long_query_time | 10 秒 | 1~2 秒 | 閾值,可設定浮點數 (如 0.5) |
log_queries_not_using_indexes | OFF | ON (謹慎) | 記錄無索引查詢,量大慎開 |
log_slow_admin_statements | OFF | ON | 記錄管理指令 (ALTER, ANALYZE 等) |
log_slow_slave_statements | OFF | ON | 記錄 Slave 執行慢的複寫 SQL |
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = ON
log_slow_admin_statements = ON
log_slow_slave_statements = ON
# 可選:輸出到資料表 (5.1+)
log_output = FILE,TABLE
my.cnf 後 systemctl restart mysqld (永久)。SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1.5;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
-- 1. 閾值內不記錄
SELECT 1; -- 0.00 sec
-- 2. 超過閾值記錄
SELECT SLEEP(3); -- 3.00 sec → 寫入 slow.log
-- 3. 檢查日誌內容
sudo cat /var/log/mysql/mysql-slow.log
# Time: 2024-01-15T03:15:22.123456Z
# User@Host: root[root] @ localhost [127.0.0.1] Id: 10
# Query_time: 3.000123 Lock_time: 0.000001 Rows_sent: 1 Rows_examined: 1
SET timestamp=1705288522;
SELECT SLEEP(3);
Query_time:總耗時 (秒)。Lock_time:等待鎖時間。Rows_sent:回傳列數。Rows_examined:掃描列數 (關鍵,遠大於 Rows_sent 表示全表掃描)。/var/log/mysql/mysql-slow.log {
daily
rotate 30
compress
missingok
notifempty
create 640 mysql mysql
sharedscripts
postrotate
mysqladmin flush-logs > /dev/null 2>&1 || true
endscript
}