測試環境:雙核 CPU、2GB 記憶體、SCSI 磁碟、日均 20 萬 PV。參數值需根據實際硬體(特別是記憶體)線性縮放。
| 參數 | 預設值 | 調優值 | 作用與調優邏輯 |
|---|---|---|---|
back_log |
50 | 500 | TCP 連接請求隊列長度。出現大量 unauthenticated user 時調大。受 OS somaxconn 限制(Linux 需同步調大 /proc/sys/net/core/somaxconn)。 |
interactive_timeout |
28800 (8h) | 7200 (2h) | 互動式連線空閒斷開時間。縮短可釋放 Sleep 連線,減少佔用。 |
wait_timeout |
28800 | 7200 | 非互動式連線空閒斷開。應用連線池需配合 validationQuery 或 testOnBorrow。 |
key_buffer_size |
8 MB | 400 MB | MyISAM 索引塊快取。InnoDB 不用此參數。設為實體記憶體 25-30%,但留足 OS/InnoDB 空間。 |
max_connections |
100 | 1024 | 最大並發連線。伴隨增加 open_files_limit (65535)。監控 Threads_connected / Max_used_connections。 |
read_buffer_size (record_buffer) |
128 KB | 16 MB | 全表掃描/排序時每線程順序讀緩衝。大表報表查詢受益。總佔用 = 值 × max_connections,謹慎設大。 |
sort_buffer_size |
2 MB | 16 MB | 每線程排序緩衡。ORDER BY/GROUP BY 無索引時用到。同樣乘以連線數,建議 2-8 MB 通常足夠。 |
table_open_cache (table_cache) |
64 | 512 | 表緩存數量。監控 Opened_tables 增長快則調大。每表佔 2 個檔案描述符。 |
thread_cache_size |
0 | 80 | 線程緩存池。減少頻繁創建/銷毀線程開銷。對比 Connections vs Threads_created,命中率 > 95% 為佳。 |
innodb_buffer_pool_size |
128 MB | 1.2 GB | InnoDB 最關鍵參數。設為實體記憶體 60-80%(專用 DB 伺服器)。包含數據、索引、自適應哈希、鎖資訊等。 |
innodb_log_file_size |
48 MB | 256 MB | Redo Log 大小。大則減少 checkpoint 頻率、提升寫入效能。修改需停服務、刪舊 logfile、重啟。 |
innodb_flush_log_at_trx_commit |
1 | 1 (生產) / 2 (高寫入可接受秒級丟失) | 1 = 完全 ACID,每提交刷盤。2 = 刷 OS 快取,效能大增但掉電丟 1 秒數據。 |
# 修改 /etc/my.cnf (Linux) 或 my.ini (Windows)
[mysqld]
back_log = 500
key_buffer_size = 400M
innodb_buffer_pool_size = 1200M
# ... 其他參數
# 重啟生效
systemctl restart mysqld
部分參數支援動態調整:SET GLOBAL sort_buffer_size = 16777216;(僅影響新連線)。
-- 連線壓力
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Aborted_connects';
-- 緩存命中
SHOW GLOBAL STATUS LIKE 'Key_read%'; -- MyISAM
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%'; -- InnoDB
-- 線程複用
SHOW GLOBAL STATUS LIKE 'Threads_created';
SHOW GLOBAL STATUS LIKE 'Connections';
vm.swappiness = 1,寧可 OOM Killer 也不 Swap。