MySQL 剖析目標是找出「哪裡花費時間最多」。本文系統講述服務器級剖析:General Log 與 Slow Log 配置、細粒度補丁、日誌解讀、分析工具鏈,並給出從日誌到優化的標準化流程。
| 特性 | General Log | Slow Log |
|---|---|---|
| 記錄時機 | 語句解析前(含失敗語句) | 語句執行後(僅成功) |
| 內容 | 所有語句、連接/斷開事件 | 超過 long_query_time 或未用索引的語句 |
| 包含執行時間 | 否 | 是(含鎖等待、掃描行數、返回行數) |
| 主要用途 | 審計、全量 SQL 回放 | 性能優化、找出慢查詢 |
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 -- 秒級,建議 1~2 秒
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1 -- 從庫慢查詢
關鍵點:
long_query_time=10 過大,Web 應用建議 1~2 秒。log_queries_not_using_indexes 會記錄全表掃描,小表頻繁查詢會刷爆日誌,謹慎開啟。slow_query_log、long_query_time,無需重啟。SET GLOBAL long_query_time = 10000; 實質關閉慢查詢記錄。long_query_time、記錄所有語句 (long_query_time=0)、輸出 InnoDB I/O、鎖等待、臨時表、Filesort 等豐富欄位、記錄 Replication 線程語句、按會話過濾。# Time: 070518 9:47:00
# User@Host: root[root] @ localhost []
# Query_time: 0.000652 Lock_time: 0.000109 Rows_sent: 1 Rows_examined: 1
SELECT ...
# Thread_id: 4
# Query_time: 0.503016 Lock_time: 0.000048 Rows_sent: 56 Rows_examined: 1113
# QC_Hit: No Full_scan: No Full_join: No Tmp_table: Yes Disk_tmp_table: No
# Filesort: Yes Disk_filesort: No Merge_passes: 0
# InnoDB_IO_r_ops: 19 InnoDB_IO_r_bytes: 311296 InnoDB_IO_r_wait: 0.382176
# InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.067538
# InnoDB_pages_distinct: 20
SELECT ...
關鍵欄位:
QC_Hit:查詢快取命中。Full_scan:全表掃描。Tmp_table / Disk_tmp_table:臨時表是否落盤。Filesort / Disk_filesort:排序是否落盤。InnoDB_IO_r_wait:InnoDB 同步讀取等待時間(磁盤 I/O 瓶頸信號)。InnoDB_queue_wait:進入 InnoDB 內核排隊時間。InnoDB_pages_distinct:訪問唯一頁數,估算工作集大小。| 工具 | 特點 | 適用場景 |
|---|---|---|
| mysqldumpslow | Perl 腳本,官方內建,聚合統計、按次數/時間排序 | 快速掃描、無補丁日誌 |
| mysql_slow_log_filter | 支援毫秒級日誌、按時間/掃描行過濾 | 補丁日誌、逐步降低閾值優化 |
| mysql_slow_log_parser | 聚合報表、輸出標準化 SQL、可直接 EXPLAIN | 深度分析、生成優化清單 |
| MySQLsla | 支援 General/Slow/Raw Log、標準化、EXPLAIN、複雜報表、資源消耗預估 | 全方位審計、容量規劃 |
EXPLAIN、檢查索引、表結構、統計信息。Lock_time、InnoDB_IO_r_wait 判斷。