萬盛學電腦網

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

MySQL 優化核心指標:SHOW STATUS 與 SHOW VARIABLES 差異解析與關鍵參數速查

MySQL 運行時狀態 (SHOW STATUS) 與配置變量 (SHOW VARIABLES) 是效能診斷的雙重視角:前者反映「當下發生了什麼」,後者決定「系統如何運作」。混淆二者會導致錯誤調優方向。本文深度解析差異,並彙總 58 個核心變量含義與調優建議。

一、根本區別

維度SHOW STATUSSHOW VARIABLES
性質運行時狀態計數器 (只讀)配置參數 (可讀可寫)
生命週期啟動後累計/即時值,重置歸零啟動讀取配置,運行時可動態修改
作用域Global / SessionGlobal / Session
修改方式不可修改SET GLOBAL var=val 或 my.cnf
典型用途健康度檢查、效能基準、異常定位參數調優、架構適配、故障迴避

二、關鍵 STATUS 指標解讀 (效能診斷儀表板)

連線與執行緒

  • 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 核心

  • 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:全表掃描排序 / 索引範圍排序 / 排序行數

三、關鍵 VARIABLES 參數調優速查 (58 選 1 核心)

參數建議值/原則說明
innodb_buffer_pool_size專用機 70-80% 物理記憶體核心緩衝池,數據+索引熱點必須放入
innodb_buffer_pool_instances4-8 (≤ 1G/實例)減少全域鎖爭用
innodb_flush_log_at_trx_commit2 (非核心) / 1 (核心金融)1=每提交刷盤最安全,2=秒級刷盤高效能
innodb_file_per_tableON獨立表空間,利於回收空間、單表遷移
innodb_log_file_size1-4G大日誌減少 checkpoint 壓力,崩潰恢復稍慢
innodb_log_buffer_size16-64M大事務避免頻繁刷日誌
max_connections預估峰值 * 1.2,上限 5000過大導致記憶體 OOM,配合 thread_cache
thread_cache_size32-64複用執行緒,降低創建銷毀開銷
table_open_cache4000-8000配合 open_files_limit,避免頻繁開關表
query_cache_type/sizeOFF / 0 (高併發寫入)QC 全域鎖瓶頸嚴重,5.7 已移除,改用 Redis
sort_buffer_size / read_rnd_buffer_size2-4M (會話級)過大易 OOM,僅對 ORDER BY/GROUP BY 生效
join_buffer_size2-8M (會話級)無索引 JOIN 時使用,優先加索引
tmp_table_size / max_heap_table_size64-256M臨時表超過轉磁碟,盡量在記憶體完成
long_query_time0.5-1 秒捕捉慢查詢,配合 log_queries_not_using_indexes
sync_binlog1 (核心) / 100-1000 (高併發非核心)Binlog 刷盤頻率,影響主從延遲與資料安全
expire_logs_days7-14自動清理舊 Binlog,防止磁碟爆滿
skip-name-resolveON跳過 DNS 反解,加快連線建立
max_connect_errors100000避免誤觸發 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  # 非動態參數需重啟

五、診斷工作流範例

  1. 現象:QPS 下降、延遲飆升
  2. 看 STATUS:SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%'; 發現 Innodb_row_lock_waits 激增
  3. 看 VARIABLES:SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; 為 50s (預設)
  4. 定位 SQL:pt-query-digest 分析慢查詢,發現大量無索引 UPDATE
  5. 調優:加索引、拆大事務、調 innodb_lock_wait_timeout=10
  6. 驗證:STATUS 指標回落、QPS 恢復

牢記:STATUS 是體溫計,VARIABLES 是處方箋。看懂體溫,開對藥方,MySQL 優化才有的放矢。

copyright © 萬盛學電腦網 all rights reserved