mysql-log-filter (Google Code 專案) 提供 Python/PHP 兩種腳本,支援多維度過濾、去重、排序、增量分析,輸出可讀性強的報表。下載:https://down.51cto.com/data/2123725 (需翻牆或鏡像)。
# 基礎:取前 10 條高頻慢查詢,去重,按執行次數排序
python mysql_filter_slow_log.py ./mysql-slow.log \
--no-duplicates --sort-execution-count --top=10 > mysql_slow_report.txt
# 進階:過濾條件 + 增量分析
php mysql_filter_slow_log.php -T=3 -eu=root \
--no-duplicates --sort-execution-count --top=10 \
--incremental linux-slow.log > mysql-slow-queries.log
# 實時監控模式 (守護進程)
tail -f -n 0 linux-slow.log | python mysql_filter_slow_log.py -T=3 -R=10000 -eu=root -eu=test &
| 參數 | 說明 |
|---|---|
| -T, --min-query-time | 最小查詢時間閾值 (秒) |
| -R, --min-rows-examined | 最小掃描行數 |
| -eu, --exclude-user | 排除用戶 (可多次) |
| --no-duplicates | 去重並輸出統計 (執行次數、首/末時間、平均/最大/總查詢時間、鎖時間、掃描/返回行數) |
| --sort-execution-count | 按執行次數排序 (另有 --sort-sum-query-time 等) |
| --top=N | 輸出前 N 條唯一查詢 |
| --incremental | 記錄檔案位置與統計到 SQLite,支援增量分析 |
| --details | 輸出每條查詢的時間戳明細 |
[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=0.01 # 記錄超過 10ms 的查詢 (5.1.21+ 支援微秒)
min_examined_row_limit=1000 # 忽略掃描行少的查詢
log_output=FILE # 強制寫檔案,避免寫 TABLE 丟失微秒
log-queries-not-using-indexes # 記錄未用索引查詢 (慎用,量大)
log-slow-admin-statements # 記錄 OPTIMIZE/ANALYZE/ALTER 等
log-slow-slave-statements # 記錄從庫慢查詢 (5.1.21+)
# 線上動態開啟 (無需重啟)
SET GLOBAL slow_query_log=1;
SET GLOBAL long_query_time=1;
腳本預設將 query_time 解析為 int,但慢查詢日誌實為 float (如 0.000123),導致報錯。需修改源碼 (約 469 行):
# 原始
query_time = (int(numbers[1].split()[0]), int(numbers[2].split()[0]), ...)
# 修正為 float
query_time = (float(numbers[1].split()[0]), float(numbers[2].split()[0]), ...)
善用分析工具,讓慢查詢無處遁形,精準定位優化目標。