為什麼要看 SHOW GLOBAL STATUS?
SHOW GLOBAL STATUS 返回伺服器啟動以來的累計計數器,是效能診斷、容量規劃、異常偵測的核心數據源。配合 SHOW VARIABLES(配置值)與 SHOW ENGINE INNODB STATUS(引擎內部),構成完整觀測體系。
核心分類與關鍵指標解讀
1. 連線與執行緒
| 變量 | 含義 | 異常判斷 |
Connections | 嘗試連線總數 (含失敗) | 短時間暴增 → 連線風暴、應用未用連線池 |
Max_used_connections | 歷史峰值同時連線數 | 接近 max_connections → 需擴容或檢查洩漏 |
Threads_connected | 當前開啟連線數 | 持續高位 → 連線池配置過大或未釋放 |
Threads_created | 建立執行緒總數 | Threads_created / Connections > 0.1 → 增加 thread_cache_size |
Threads_running | 非睡眠執行緒數 (實際併發) | 突增 → 慢查詢堆積、鎖爭用、磁碟瓶頸 |
2. 查詢與快取
| 變量 | 含義 | 解讀 |
Com_select | SELECT 執行次數 | QPS 基線,排除快取命中 |
Com_insert/update/delete | 寫入操作計數 | 寫入比例、業務波動偵測 |
Questions | 客戶端發送語句數 (含存過程內部) | 與 Queries 差異 = 存過程內部語句 |
Qcache_hits | 查詢快取命中次數 | 命中率 = Qcache_hits / (Qcache_hits + Com_select) |
Qcache_lowmem_prunes | 因記憶體不足被清理的查詢數 | 持續增長 → 增大 query_cache_size 或關閉 QC |
Qcache_free_blocks | 快取中空閒記憶體塊數 | 過大 → 碎片化,執行 FLUSH QUERY CACHE |
3. Handler 層存取模式 (最誠實的 SQL 執行鏡像)
| 變量 | 存取模式 | EXPLAIN type 對應 | 異常含義 |
Handler_read_key | 索引精確查找 | const / eq_ref / ref / range | 數值大 → 索引利用良好 |
Handler_read_next | 索引順序讀取 (範圍/排序) | range / index | ORDER BY 索引列時增長 |
Handler_read_rnd | 固定位置讀取 (需排序) | filesort | 大量 → 缺乏排序索引 |
Handler_read_rnd_next | 全表掃描下一行 | ALL | 核心指標,除以 Com_select > 4000 → 嚴重全掃 |
Handler_read_first | 讀索引第一行 | index (全索引掃描) | 大量 → 強制索引掃描 |
4. InnoDB 緩衝池與 I/O
| 變量 | 含義 | 健康基線 |
Innodb_buffer_pool_read_requests | 邏輯讀請求 | 基線分母 |
Innodb_buffer_pool_reads | 物理讀 (未命中) | reads/requests < 1% |
Innodb_buffer_pool_pages_dirty | 髒頁數 | 波動正常,持續高 → 刷盤跟不上 |
Innodb_buffer_pool_pages_free | 空閒頁數 | 為 0 → Buffer Pool 滿,需擴容 |
Innodb_data_reads/writes | 資料檔讀寫頁數 | 對應磁碟 IOPS |
Innodb_log_writes | Redo Log 寫入次數 | 對應事務提交頻率 |
Innodb_os_log_fsyncs | fsync() 呼叫次數 | 受 innodb_flush_log_at_trx_commit 影響 |
5. InnoDB 行鎖與等待
| 變量 | 含義 | 異常判斷 |
Innodb_row_lock_waits | 行鎖等待次數 | > 0 且持續增長 → 熱點行爭用 |
Innodb_row_lock_time_avg | 平均等待時間 (ms) | > 10ms → 鎖爭用嚴重 |
Innodb_row_lock_time_max | 最大等待時間 | 尖峰排查依據 |
6. 臨時表與排序
| 變量 | 含義 | 優化方向 |
Created_tmp_tables | 記憶體臨時表數 | 正常 |
Created_tmp_disk_tables | 磁碟臨時表數 | 比率 > 25% → 增大 tmp_table_size/max_heap_table_size |
Sort_merge_passes | 多路歸併排序次數 | > 0 → 增大 sort_buffer_size (≤ 8MB) |
Sort_scan | 全掃描排序 | 缺乏排序索引 |
7. 表鎖 (MyISAM/系統表)
Table_locks_immediate -- 立即獲得
Table_locks_waited -- 等待
-- Table_locks_waited / Table_locks_immediate > 0.0001 (萬分之一) 考慮遷移 InnoDB
8. 檔案描述符
Open_files / open_files_limit < 75% -- 安全閾值
Opened_files 持續增長 -- 表快取不足或表頻繁開關
9. 複制相關 (從庫必看)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
-- 任一 No 或延遲大 → 檢查網路、主庫負載、大事務、從庫單執行緒瓶頸 (5.7+ 可用 MTS)
實戰監控儀表板建議 (Grafana + Prometheus + mysqld_exporter)
- 黃金指標:QPS、延遲 (P99)、錯誤率、併發執行緒
- 資源指標:CPU、記憶體、磁碟 IOPS/延遲/使用率、網路流量
- 引擎指標:Buffer Pool 命中率、髒頁比率、Redo Log 寫入/fsync、行鎖等待、History List Length
- SQL 指標:慢查詢數、全掃描率、臨時表磁盤化率、排序合併率、快取命中率
- 複制指標:IO/SQL 執行緒狀態、延遲秒數、Relay Log 積壓
定期健檢腳本核心邏輯
#!/bin/bash
# 關鍵比率計算範例
mysql -e "SHOW GLOBAL STATUS" | awk '
/Innodb_buffer_pool_read_requests/ {req=$2}
/Innodb_buffer_pool_reads/ {rd=$2}
END {if (req>0) printf "BP命中率: %.2f%%\n", (1-rd/req)*100}'
mysql -e "SHOW GLOBAL STATUS" | awk '
/Handler_read_rnd_next/ {rnd=$2}
/Com_select/ {sel=$2}
END {if (sel>0) printf "全掃描率: %.0f\n", rnd/sel}'
mysql -e "SHOW GLOBAL STATUS" | awk '
/Created_tmp_disk_tables/ {disk=$2}
/Created_tmp_tables/ {mem=$2}
END {if (mem>0) printf "臨時表磁盤化: %.2f%%\n", disk/mem*100}'