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

MySQL 效能調優實戰:基於 Status 變量的 11 大核心指標深度解析

     編輯:MySQL 資料庫相關知識

核心理念:拒絕盲目複製配置,善用 SHOW GLOBAL STATUS 與 SHOW VARIABLES 量身定製

同樣配置在不同硬體、流量、讀寫比、資料分佈下表現迥異。唯有依據實際運行指標調優,才是正道。

一、慢查詢

SHOW VARIABLES LIKE '%slow%';
-- log_slow_queries = ON
-- slow_launch_time = 2  (秒)

SHOW GLOBAL STATUS LIKE '%slow%';
-- Slow_queries = 4148
  • 慢查詢閾值建議 ≤ 5 秒,微秒級需打 Percona Patch
  • 主從架構可僅在從庫開啟慢查詢日誌,減輕主庫壓力
  • 定期用 pt-query-digest 分析慢查詢日誌,針對性優化 SQL

二、連接數

SHOW VARIABLES LIKE 'max_connections';  -- 256
SHOW GLOBAL STATUS LIKE 'Max_used_connections';  -- 245

健康水位: Max_used_connections / max_connections ≈ 85%

  • 比例 < 10% → max_connections 設過大,浪費記憶體
  • 頻繁報 ERROR 1040: Too many connections → 擴從庫分讀壓、或調大上限

三、Key Buffer (MyISAM 核心)

SHOW VARIABLES LIKE 'key_buffer_size';  -- 512MB
SHOW GLOBAL STATUS LIKE 'key_read%';
-- Key_read_requests = 27813678764
-- Key_reads = 6798830

未命中率 = Key_reads / Key_read_requests × 100% = 0.0244% (極優)

  • < 0.1% 良好;< 0.01% 可能配過大
  • 輔助指標:Key_blocks_used / (Key_blocks_used + Key_blocks_unused) ≈ 80%

四、臨時表

SHOW GLOBAL STATUS LIKE 'created_tmp%';
-- Created_tmp_tables = 1771587
-- Created_tmp_disk_tables = 21197  (磁盤臨時表)

磁盤臨時表比率 = Created_tmp_disk_tables / Created_tmp_tables ≤ 25%(例中 1.2% 優)

  • 調大 tmp_table_size、max_heap_table_size(取較小者生效)
  • 避免 TEXT/BLOB、GROUP BY、DISTINCT 觸發磁盤臨時表

五、Open Table 狀態

SHOW GLOBAL STATUS LIKE 'open%tables%';
-- Open_tables = 919, Opened_tables = 1951
SHOW VARIABLES LIKE 'table_open_cache';  -- 2048
  • Open_tables / Opened_tables ≥ 85%
  • Open_tables / table_open_cache ≤ 95%
  • Opened_tables 增長快 → 調大 table_open_cache

六、執行緒緩存

SHOW GLOBAL STATUS LIKE 'Thread%';
-- Threads_created = 570 (較大說明頻繁建線程)
SHOW VARIABLES LIKE 'thread_cache_size';  -- 64
  • Threads_created 持續增長 → 調大 thread_cache_size
  • 線程池模式 (Thread Pool) 可進一步降低建銷毀開銷

七、查詢緩存

SHOW GLOBAL STATUS LIKE 'qcache%';
SHOW VARIABLES LIKE 'query_cache%';

關鍵公式:

  • 碎片率 = Qcache_free_blocks / Qcache_total_blocks × 100% > 20% → FLUSH QUERY CACHE 或降 query_cache_min_res_unit
  • 利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size × 100% < 25% → 縮小;> 80% 且 Lowmem_prunes > 50 → 擴大或整理碎片
  • 命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits × 100% 例中僅 1.94%(寫多讀少場景查詢緩存收益低)
⚠️ MySQL 8.0 已移除 Query Cache,建議改用 Redis 等外部緩存。

八、排序使用

SHOW GLOBAL STATUS LIKE 'sort%';
-- Sort_merge_passes = 29 (歸並排序次數)
  • Sort_merge_passes 大 → 調大 sort_buffer_size、read_rnd_buffer_size
  • 盲目調大 sort_buffer_size 反而可能因 CPU 緩存失效降速

九、檔案描述符

SHOW GLOBAL STATUS LIKE 'open_files';  -- 1410
SHOW VARIABLES LIKE 'open_files_limit';  -- 4590

Open_files / open_files_limit ≤ 75%

十、表鎖爭用

SHOW GLOBAL STATUS LIKE 'table_locks%';
-- Table_locks_immediate = 490206328
-- Table_locks_waited = 2084912

即時/等待比 > 5000 → 考慮遷移至 InnoDB(行鎖),高併發寫入場景必選。

十一、全表掃描率


SHOW GLOBAL STATUS LIKE 'handler_read%';
-- Handler_read_rnd_next = 18912877839
SHOW GLOBAL STATUS LIKE 'com_select';  -- 222693559

表掃描率 = Handler_read_rnd_next / Com_select > 4000 → 索引缺失嚴重,優先補索引;輔助調大 read_buffer_size(≤ 8MB)。

總結:建立監控儀表盤,定期巡檢 11 大指標,動態調優,才是 MySQL 高可用的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved