MySQL 運行時狀態 (SHOW STATUS) 與配置變量 (SHOW VARIABLES) 是效能診斷的雙重視角:前者反映「當下發生了什麼」,後者決定「系統如何運作」。混淆二者會導致錯誤調優方向。本文深度解析差異,並彙總 58 個核心變量含義與調優建議。
| 維度 | SHOW STATUS | SHOW VARIABLES |
|---|---|---|
| 性質 | 運行時狀態計數器 (只讀) | 配置參數 (可讀可寫) |
| 生命週期 | 啟動後累計/即時值,重置歸零 | 啟動讀取配置,運行時可動態修改 |
| 作用域 | Global / Session | Global / Session |
| 修改方式 | 不可修改 | SET GLOBAL var=val 或 my.cnf |
| 典型用途 | 健康度檢查、效能基準、異常定位 | 參數調優、架構適配、故障迴避 |
Threads_connected:當前開啟連線數Threads_running:非 Sleep 狀態執行緒數 (真實並發)Connections:歷史總連線嘗試次數Aborted_clients / Aborted_connects:異常斷開/連線失敗計數Questions:發送給 Server 的查詢總數 (含緩存命中)Com_select / Com_insert / Com_update / Com_delete:各類 DML 計數Qcache_hits / Qcache_inserts / Qcache_not_cached:查詢緩存命中/寫入/未緩存 (5.7 已移除 QC)Slow_queries:超過 long_query_time 的查詢數Innodb_buffer_pool_read_requests / Innodb_buffer_pool_reads:邏輯讀/物理讀 → 命中率 = 1 - reads/requests (目標 > 99%)Innodb_rows_inserted / updated / deleted / read:行級增刪改查計數Innodb_log_waits:因日誌緩衝區滿而等待次數 (應為 0)Innodb_row_lock_waits / Innodb_row_lock_time_avg:行鎖等待次數/平均耗時Created_tmp_tables / Created_tmp_disk_tables:記憶體/磁碟臨時表比例 (磁碟比例應 < 10%)Sort_scan / Sort_range / Sort_rows:全表掃描排序 / 索引範圍排序 / 排序行數| 參數 | 建議值/原則 | 說明 |
|---|---|---|
innodb_buffer_pool_size | 專用機 70-80% 物理記憶體 | 核心緩衝池,數據+索引熱點必須放入 |
innodb_buffer_pool_instances | 4-8 (≤ 1G/實例) | 減少全域鎖爭用 |
innodb_flush_log_at_trx_commit | 2 (非核心) / 1 (核心金融) | 1=每提交刷盤最安全,2=秒級刷盤高效能 |
innodb_file_per_table | ON | 獨立表空間,利於回收空間、單表遷移 |
innodb_log_file_size | 1-4G | 大日誌減少 checkpoint 壓力,崩潰恢復稍慢 |
innodb_log_buffer_size | 16-64M | 大事務避免頻繁刷日誌 |
max_connections | 預估峰值 * 1.2,上限 5000 | 過大導致記憶體 OOM,配合 thread_cache |
thread_cache_size | 32-64 | 複用執行緒,降低創建銷毀開銷 |
table_open_cache | 4000-8000 | 配合 open_files_limit,避免頻繁開關表 |
query_cache_type/size | OFF / 0 (高併發寫入) | QC 全域鎖瓶頸嚴重,5.7 已移除,改用 Redis |
sort_buffer_size / read_rnd_buffer_size | 2-4M (會話級) | 過大易 OOM,僅對 ORDER BY/GROUP BY 生效 |
join_buffer_size | 2-8M (會話級) | 無索引 JOIN 時使用,優先加索引 |
tmp_table_size / max_heap_table_size | 64-256M | 臨時表超過轉磁碟,盡量在記憶體完成 |
long_query_time | 0.5-1 秒 | 捕捉慢查詢,配合 log_queries_not_using_indexes |
sync_binlog | 1 (核心) / 100-1000 (高併發非核心) | Binlog 刷盤頻率,影響主從延遲與資料安全 |
expire_logs_days | 7-14 | 自動清理舊 Binlog,防止磁碟爆滿 |
skip-name-resolve | ON | 跳過 DNS 反解,加快連線建立 |
max_connect_errors | 100000 | 避免誤觸發 Host blocked |
-- 線上生效 (重啟失效)
SET GLOBAL innodb_buffer_pool_size = 6442450944; -- 6G (5.7.5+ 支援動態調整)
SET GLOBAL long_query_time = 0.5;
-- 持久化寫入 my.cnf
vim /etc/my.cnf
# 修改對應參數
systemctl restart mysqld # 非動態參數需重啟
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%'; 發現 Innodb_row_lock_waits 激增SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; 為 50s (預設)pt-query-digest 分析慢查詢,發現大量無索引 UPDATEinnodb_lock_wait_timeout=10牢記:STATUS 是體溫計,VARIABLES 是處方箋。看懂體溫,開對藥方,MySQL 優化才有的放矢。