MySQL 開放的內核參數讓我們能針對業務負載精細調優。本文聚焦四大高影響力變量:索引緩衝、順讀緩衝、表緩存、慢查詢閾值,給出調優方向、推薦值與監控指標。
| 變量 | 作用域 | 核心作用 | 調優方向 | 經驗推薦值 | 監控指標 |
|---|---|---|---|---|---|
key_buffer_size | Global | MyISAM 索引塊緩衝區(塊大小 1K) | 增大至物理內存 25%-30% | 1-4GB (視內存/數據量) | Key_reads / Key_read_requests < 0.01 |
read_buffer_size | Session | 全表掃描時的順序讀緩衝 | 適度增大(如 2MB-8MB) | 2M-8M | Handler_read_rnd_next / Com_select |
table_open_cache (5.1+) | Global | 所有線程共享的表緩存數 | 增大至 max_connections × 表數因子 | 2000-10000+ | Opened_tables / Uptime 增長率 |
long_query_time | Global/Session | 慢查詢日誌記錄閾值(秒) | 降低至 0.5-1 秒捕獲更多慢查詢 | 0.5-1 | Slow_queries 計數、慢查詢日誌量 |
-- 臨時生效(重啟失效)
SET GLOBAL key_buffer_size = 268435456; -- 256MB
SET GLOBAL read_buffer_size = 2097152; -- 2MB
SET GLOBAL table_open_cache = 5000;
SET GLOBAL long_query_time = 0.5;
-- 永久生效:編輯 my.cnf [mysqld] 區塊
[mysqld]
key_buffer_size = 256M
read_buffer_size = 2M
table_open_cache = 5000
long_query_time = 0.5
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
key_buffer 可能擠佔 OS Cache,導致磁盤 I/O 上升。innodb_buffer_pool_size 才是核心**(建議 70-80% 內存),key_buffer 僅服務 MyISAM/系統表。table_open_cache 替換舊 table_cache。四大參數是入門必修課,真正的高手在 innodb_buffer_pool、innodb_flush_log_at_trx_commit、innodb_io_capacity、innodb_read_io_threads 等 InnoDB 專屬參數上精耕細作。