為什麼需要慢日誌?
數據庫響應慢 90% 由查詢引起。MySQL 不像 Oracle 自動推薦優化,**必須主動開啟慢日誌、分析、優化、驗證** 形成閉環。
慢日誌記錄格式解析
# Time: 2023-10-10T09:33:57.123456Z
# User@Host: root[root] @ localhost [] Id: 1
# Query_time: 0.000342 Lock_time: 0.000142 Rows_sent: 3 Rows_examined: 3
use test;
SET timestamp=1412904837;
SELECT * FROM t;
Query_time:總耗時 (秒),含鎖等待、IO、CPU。
Lock_time:等待鎖時間。
Rows_sent:返回客戶端行數。
Rows_examined:存儲引擎層掃描行數。**核心效率指標**:Rows_examined / Rows_sent 越大,索引利用越差。
核心參數配置 (動態生效,持久化寫入 my.cnf)
| 參數 | 建議值 | 說明 |
slow_query_log | ON | 開啟慢日誌 |
slow_query_log_file | /mysql/log/slow.log | 獨立磁碟/目錄,避免佔滿根分區 |
long_query_time | 0.5 ~ 1.0 | 秒級閾值,微秒級精度 (5.1+)。生產建議 1s,分析期可調 0.1s |
log_queries_not_using_indexes | ON | 記錄無索引查詢 (全表掃描),**極其重要** |
log_throttle_queries_not_using_indexes | 60 | 每分鐘最多記錄 60 條無索引查詢,防止日誌爆炸 |
min_examined_row_limit | 1000 | 掃描行數超過此值才記錄,過濾微小表誤報 |
log_output | FILE | FILE/TABLE/NONE。FILE 便於工具分析,TABLE 便于 SQL 查詢 |
動態開啟示例
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 0.5;
SET GLOBAL log_queries_not_using_indexes = ON;
SET GLOBAL log_throttle_queries_not_using_indexes = 60;
SET GLOBAL min_examined_row_limit = 1000;
分析工具鏈對比
| 工具 | 語言 | 核心優勢 | 適用場景 |
| mysqldumpslow | Perl (內建) | 零依賴、快速 Top N、按時間/次數/行數排序 | 日常快速巡檢 |
| pt-query-digest (Percona Toolkit) | Perl | 統計全維度 (次數、時間分佈、95%分位、佔比)、生成報表、支持歷史趨勢 | **生產標準分析**、定期報告 |
| mysqlsla | Perl | 早期工具,功能類 pt-query-digest,維護較少 | 歷史項目兼容 |
| go-mysql-slowlog | Go | 高性能解析、JSON 輸出、易集成 ELK/Grafana | 實時流式分析、大規模集群 |
mysqldumpslow 常用姿勢
pt-query-digest 標準報告解讀
- 上一篇文章: MySQL 5.6 慢查詢優化實戰 (二):EXPLAIN 深度解析與 SQL 改寫技巧
- 下一篇文章: mysqldump extended-insert 參數深度測試:導出導入性能差異達 20 倍
Copyright ©
程式碼之家 All Rights Reserved