MySQL 啟動時讀取 my.cnf (Linux) 或 my.ini (Windows),分為 [client] 與 [mysqld] 兩大區塊。本文詳細解析生產環境常用調校參數、預設值、調整原則與監控指令。
結構總覽
[client] # 客戶端工具 (mysql, mysqldump 等) 參數
port = 3306
default-character-set = utf8
[mysql] # mysql 命令列專用
default-character-set = utf8
[mysqld] # 伺服器核心參數
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
character-set-server = utf8mb4
default-storage-engine = InnoDB
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
max_connections = 1000
...
核心參數分類詳解
連線與快取
| 參數 | 預設 | 建議調整 | 說明 |
| max_connections | 151 | 500-2000 | 最大並發連線,預留 1 給 SUPER 用戶。Too many connections 錯誤時調大。 |
| query_cache_size | 0 (5.7+ 預設關閉) | 0 或 64M-256M | 唯讀多、寫少場景啟用;寫入頻繁會成瓶頸。8.0 已移除。 |
| table_open_cache | 2000 | 4000-8000 | 表快取數,配合 max_connections,監控 Open_tables 指標。 |
| thread_cache_size | 自動 | 100-200 | 執行緒快取,減少創建銷毀開銷,監控 Threads_created。 |
MyISAM 專屬 (漸少用,仍有舊系統)
| 參數 | 建議值 | 說明 |
| key_buffer_size | 實體記憶體 20-25% | 索引塊快取,關鍵指標 Key_reads/Key_read_requests。 |
| read_buffer_size | 128K-256K | 全表掃描緩衝,每線程分配,不可過大。 |
| read_rnd_buffer_size | 256K | 排序後隨機讀取緩衝。 |
| sort_buffer_size | 256K-512K | 排序緩衝,每線程,500 線程約 125-250MB。 |
| myisam_sort_buffer_size | 64M-128M | 建立索引/REPAIR TABLE 排序緩衝。 |
InnoDB 核心 (主流引擎)
| 參數 | 建議值 | 說明 |
| innodb_buffer_pool_size | 實體記憶體 70-80% | 最關鍵參數,緩存資料+索引,監控 Innodb_buffer_pool_reads/read_requests。 |
| innodb_log_file_size | Buffer Pool 25-50% | 單一記錄檔大小,較大減少 checkpoint 壓力,啟動恢復較慢。 |
| innodb_log_buffer_size | 8M-64M | 記錄檔寫入緩衝,大交易可調大。 |
| innodb_flush_log_at_trx_commit | 1 | 1=完整 ACID (每提交刷盤);2=每提交寫 OS 快取,每秒刷盤;0=每秒寫並刷盤。生產建議 1。 |
| innodb_file_per_table | ON | 獨立表空間,支援 DROP TABLE 釋放空間、可攜式表空間匯入。 |
| innodb_thread_concurrency | 0 (自動) | 0 表示不限制,高併發可試 2x CPU 核心數。 |
| innodb_flush_method | O_DIRECT | 避免雙重快取 (OS + InnoDB),需檔案系統支援。 |
其他常用
tmp_table_size / max_heap_table_size:記憶體臨時表上限,超過轉磁碟表,建議 64M-256M。
slow_query_log = ON, long_query_time = 1:慢查詢日誌,調優依據。
log_bin = ON, binlog_format = ROW:複寫必備,ROW 格式最安全。
expire_logs_days = 7:自動清理舊 Binlog。
參數生效與監控指令
# 查看目前運行值
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW GLOBAL VARIABLES LIKE 'max_connections';
# 查看狀態計數器 (配合參數效果驗證)
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
SHOW GLOBAL STATUS LIKE 'Threads_created';
調優原則
- 一次只調一個參數,觀察 24-48 小時。
- 以監控指標 (命中率、等待時間、佇列長度) 為準,不盲目套用網路模板值。
- 重大變更 (如
innodb_log_file_size) 需停機操作,提前規劃維護窗口。