很多 DBA 混淆 SHOW STATUS (運行時狀態) 與 SHOW VARIABLES (配置參數)。本文通過 InnoDB_rows_% 與 query_cache_% 實例,徹底釐清二者差異、用途與調優決策邏輯。
| 維度 | SHOW STATUS (狀態值) | SHOW VARIABLES (配置值) |
|---|---|---|
| 性質 | **只讀、運行時動態累計** | **可讀寫、啟動/運行時配置** |
| 來源 | Server 層/引擎層計數器 | 配置文件/命令行/SET 指令 |
| 生命週期 | 實例啟動後單調遞增 (部分可重置) | 修改即時生效 (部分需重啟) |
| 用途 | **監控、診斷、趨勢分析** | **調優、調整行為** |
| 典型前綴 | Threads_, Connections_, Innodb_, Qcache_, Select_, Sort_ | innodb_, query_cache_, sort_buffer_, max_connections |
mysql> SHOW STATUS LIKE 'Innodb_rows_%';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| Innodb_rows_deleted | 0 |
| Innodb_rows_inserted | 1169098 |
| Innodb_rows_read | 7955216 |
| Innodb_rows_updated | 0 |
+----------------------+---------+
Rows_read (795萬) >> Rows_inserted (116萬) → **讀密集型負載**。innodb_buffer_pool_size、建立覆蓋索引、優化慢查詢、考慮讀寫分離。Rows_updated 偏高 → 寫熱點,關注鎖競爭、Redo Log 刷盤、innodb_flush_log_at_trx_commit。mysql> SHOW VARIABLES LIKE 'query_cache_%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 16777216 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+----------+
SHOW STATUS LIKE 'Qcache_%' (命中率 Qcache_hits/(Qcache_hits+Qcache_inserts))。Qcache_free_blocks 多) → 增大 query_cache_min_res_unit 或關閉 QC (MySQL 8.0 已移除)。query_cache_type 可動態切換 ON/OFF/DEMAND (無需重啟)。1. STATUS 發現: Threads_running 持續 > 500 (高併發)
2. VARIABLES 調整: 增大 max_connections, thread_pool_size (Percona), innodb_thread_concurrency
3. STATUS 驗證: Threads_running 下降, 慢查詢減少, QPS 上升
GLOBAL 只影響新連接,SESSION 僅當前連接。innodb_buffer_pool_size 以字節為單位,key_buffer_size 同,別把 MB 當字節寫。一句話總結: **STATUS 是體溫計 (告訴你發燒了),VARIABLES 是處方藥 (治療發燒);看懂體溫單,開對藥方,才是調優正道。**