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

MySQL 狀態變量深度解讀:從 Handler、InnoDB、Query Cache 到鎖、排序、複制的全方位監控指標體系

     編輯:MySQL 資料庫相關知識

為什麼要看 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_selectSELECT 執行次數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 / indexORDER 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_writesRedo Log 寫入次數對應事務提交頻率
Innodb_os_log_fsyncsfsync() 呼叫次數受 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}'
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved