首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 程序剖析全攻略:Slow Log、General Log、工具鏈與實戰優化流程

     編輯:MySQL 資料庫相關知識

MySQL 剖析目標是找出「哪裡花費時間最多」。本文系統講述服務器級剖析:General Log 與 Slow Log 配置、細粒度補丁、日誌解讀、分析工具鏈,並給出從日誌到優化的標準化流程。

1. 兩大日誌對比

特性General LogSlow Log
記錄時機語句解析前(含失敗語句)語句執行後(僅成功)
內容所有語句、連接/斷開事件超過 long_query_time 或未用索引的語句
包含執行時間否是(含鎖等待、掃描行數、返回行數)
主要用途審計、全量 SQL 回放性能優化、找出慢查詢

2. Slow Log 核心配置

[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 會記錄全表掃描,小表頻繁查詢會刷爆日誌,謹慎開啟。
  • MySQL 5.1+ 支援運行時動態修改 slow_query_log、long_query_time,無需重啟。
  • 5.0 版本變通:SET GLOBAL long_query_time = 10000; 實質關閉慢查詢記錄。

3. 細粒度需求與社區補丁

  • 秒級粒度不足:高併發 Web 單頁生成 <1s,150ms 查詢即屬慢查詢。
  • 子線程 (Replication SQL Thread) 語句不記錄。
  • Percona / MySQL Performance Blog 補丁:支援毫秒級 long_query_time、記錄所有語句 (long_query_time=0)、輸出 InnoDB I/O、鎖等待、臨時表、Filesort 等豐富欄位、記錄 Replication 線程語句、按會話過濾。
    缺點:需自行編譯 MySQL,生產環境需充分測試。
  • MySQL 5.1 官方合入部分功能(毫秒級、微秒輸出),新版補丁未合入主線。

4. Slow Log 格式解讀

標準格式 (5.0/5.1)

# 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:訪問唯一頁數,估算工作集大小。

5. 日誌分析工具鏈

工具特點適用場景
mysqldumpslowPerl 腳本,官方內建,聚合統計、按次數/時間排序快速掃描、無補丁日誌
mysql_slow_log_filter支援毫秒級日誌、按時間/掃描行過濾補丁日誌、逐步降低閾值優化
mysql_slow_log_parser聚合報表、輸出標準化 SQL、可直接 EXPLAIN深度分析、生成優化清單
MySQLsla支援 General/Slow/Raw Log、標準化、EXPLAIN、複雜報表、資源消耗預估全方位審計、容量規劃

6. 標準化優化流程

  1. 開啟 Slow Log(含補丁或 5.1+ 微秒級),採集代表性負載 (1~4 小時)。
  2. 用工具聚合,找出三類目標:
    Long Queries (單次耗時長)、
    High-Impact Queries (總耗時佔比高,如 10ms×1000次/秒)、
    New Queries (新出現且惡化趨勢)。
  3. 對目標 SQL 執行 EXPLAIN、檢查索引、表結構、統計信息。
  4. 優化(加索引、改 SQL、調參數、分表等)。
  5. 驗證:重新採集日誌,確認目標指標下降,無副作用(如 INSERT 變慢)。
  6. 迭代至滿足 SLA。

7. 避坑指南

  • 「出現在 Slow Log ≠ 一定慢」:可能當時鎖等待、冷緩存、備份 I/O 爭用、併發壓力。需結合 Lock_time、InnoDB_IO_r_wait 判斷。
  • 「不在 Slow Log ≠ 快」:高頻微秒查詢總耗時可能超過慢查詢,需關注 High-Impact 類。
  • 盲目加索引會拖慢寫入,優化後必須回歸測試寫入路徑。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved