萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 效能問題定位標準化流程:從 OS 層到引擎層 7 步驟

面對 MySQL 變慢、卡頓,遵循「由外而內、由粗到細」7 步驟標準化定位,快速鎖定瓶頸層級。

Step 1: OS 資源總覽 — top / nmon / dstat

top -c  # 關注:Load Average ≤ CPU 核心數、%us/%sy/%wa、%MEM、SWAP 使用率
  • Load > 核心數 → CPU 飽和或 IO 等待。
  • %wa 高 → 磁碟子系統瓶頸。
  • SWAP 使用 > 0 → 記憶體不足,InnoDB Buffer Pool 可能被換出。

Step 2: 網路層 — netstat / iftop

netstat -i 1          # 觀察 RX-ERR/TX-ERR/DROP 是否遞增
iftop -n -B           # 按 S/D 切換顯示本端/遠端埠,鎖定大流量連線

Step 3: 磁碟 IO — iostat / iotop / dd 基準測試

iostat -x 2           # 關注 %util、await、svctm、r/s+w/s
iotop -o              # 僅顯示正在做 IO 的進程
# 基準測試 (需在維護窗口)
dd if=/dev/zero of=/data/test bs=64k count=16k conv=fsync  # 寫入 ~565 MB/s (EMC 參考)
dd if=/data/test of=/dev/null bs=64k                        # 讀取 ~675 MB/s

Step 4: Query 壓力 — mysqladmin extended status

mysqladmin -uroot -P3309 ext -ri 1 | grep -i questions
# 每秒 Questions (含 SELECT) 增長率

Step 5: 鎖等待 — information_schema 即時查詢

SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread,
       r.trx_query waiting_query,
       b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread,
       b.trx_query blocking_query
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id\G

Step 6: InnoDB 內部狀態

SHOW ENGINE INNODB STATUS\G
-- 關注:SEMAPHORES (信號量等待)、TRANSACTIONS (活躍事務)、
-- FILE I/O (AIO 執行緒)、BUFFER POOL (命中率、髒頁比例)、
-- LOG (LSN、flush 狀態)

Step 7: 歷史趨勢 — 監控系統

  • Zabbix / Prometheus + Grafana 模板:mysql_global_status、mysql_global_variables、mysql_innodb_metrics。
  • 關鍵儀表板:QPS/TPS、慢查詢數、連線數、緩衝池命中率、Replication Lag、磁碟 IOPS/Throughput。

定位心法

  1. 先看 OS,排除硬體/網路/資源爭用。
  2. 再看 MySQL 內部:鎖、事務、Buffer Pool、IO 子系統。
  3. 最後看 SQL:慢查詢 → EXPLAIN → 索引/改寫/參數。
  4. 所有操作留存證據 (截圖/日誌/指標圖),便於複盤與知識沉澱。
copyright © 萬盛學電腦網 all rights reserved