MySQL 效能調優的核心在於「測量、分析、調整」閉環。善用 SHOW GLOBAL STATUS 與 SHOW VARIABLES 觀察關鍵指標,能快速定位瓶頸並制定針對性優化策略。本文整理十一大核心維度的監控指標、計算公式與調優建議。
SHOW VARIABLES LIKE '%slow%';
SHOW GLOBAL STATUS LIKE '%slow%';
log_slow_queries = ON、slow_launch_time = 2:啟用慢查詢日誌,閾值 2 秒。Slow_queries = 4148:累積慢查詢數。SHOW VARIABLES LIKE 'max_connections'; -- 256
SHOW GLOBAL STATUS LIKE 'Max_used_connections'; -- 245
Max_used_connections / max_connections ≈ 85%max_connections 設過大,浪費記憶體。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%(極佳)Key_blocks_used / (Key_blocks_unused + Key_blocks_used) ≈ 80% 為宜。SHOW GLOBAL STATUS LIKE 'created_tmp%';
-- Created_tmp_tables = 1,771,587
-- Created_tmp_disk_tables = 21,197
-- 磁碟臨時表比率 = 1.20% (優秀,建議 ≤ 25%)
tmp_table_size、max_heap_table_size(取較小者)控制記憶體臨時表上限,超過則轉磁碟。SHOW GLOBAL STATUS LIKE 'open%tables%';
-- Open_tables = 919, Opened_tables = 1951
SHOW VARIABLES LIKE 'table_cache'; -- 2048
Open_tables / Opened_tables ≥ 85%、Open_tables / table_cache ≤ 95%Opened_tables 過大表示 table_cache(5.1.3+ 稱 table_open_cache)過小。SHOW GLOBAL STATUS LIKE 'Thread%';
-- Threads_created = 570, thread_cache_size = 64
Threads_created 過大表示頻繁建立執行緒,增加 thread_cache_size 可復用執行緒降低開銷。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% 且 Qcache_lowmem_prunes > 50 過小。(Qcache_hits - Qcache_inserts) / Qcache_hits × 100%:本例 1.94% 極低,可能寫入頻繁導致快取失效。SHOW GLOBAL STATUS LIKE 'sort%';
-- Sort_merge_passes = 29(需增加 sort_buffer_size 減少磁碼合併排序)
sort_buffer_size、read_rnd_buffer_size 可改善排序效能,但盲目調大反而可能降低效能。SHOW GLOBAL STATUS LIKE 'open_files'; -- 1410
SHOW VARIABLES LIKE 'open_files_limit'; -- 4590
-- 比率 30.7% (建議 ≤ 75%)
SHOW GLOBAL STATUS LIKE 'table_locks%';
-- Table_locks_immediate = 490,206,328
-- Table_locks_waited = 2,084,912
-- 比率 235 (> 5000 建議改用 InnoDB 行鎖)
SHOW GLOBAL STATUS LIKE 'handler_read%';
SHOW GLOBAL STATUS LIKE 'com_select';
-- 掃描率 = Handler_read_rnd_next / Com_select
-- > 4000 表示索引不足,需檢查索引設計或適度增加 read_buffer_size(≤ 8MB)