| 參數 | 作用 | 建議值 |
innodb_buffer_pool_size | 緩存索引+數據頁,InnoDB 性能核心 | 物理內存 50%-80% (專用 DB 可 70-80%) |
innodb_additional_mem_pool_size | 數據字典、內部結構 (5.6.3+ 已整合到 buffer pool) | 默認 1MB,報錯再調大 |
innodb_log_buffer_size | 事務日誌緩存,提交前暫存 | 1-16MB,頻繁寫入可調大 |
innodb_flush_log_at_trx_commit | 0=秒刷盤、1=提交刷盤(默認/安全)、2=提交寫OS緩存 | 核心業務=1,非核心可 2 |
innodb_max_dirty_pages_pct | 髒頁比例上限,觸發刷盤 | 75-90,過大導致崩潰恢復慢、關機慢 |
命中率:(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%,目標 > 99%。
二、連接參數優化
1. 最大連接數 max_connections / 積壓隊列 back_log
max_connections:默認 151,建議 128-512 (視內存、併發)
- 使用率:
Max_used_connections / max_connections * 100%,目標 50-80%
back_log:連接爆發時暫存隊列,默認 80,建議 128-256
2. 連接超時 wait_timeout / interactive_timeout
- 默認 28800s (8小時),導致大量
Sleep 連接佔用槽位
- 建議:120-300 秒,兩參數同步修改
- 排查:
SHOW PROCESSLIST 看大量 Sleep → 調小
3. 禁用 DNS 反解 skip-name-resolve
- 新連接不再做反向 DNS 解析,顯著降低連接建立延遲
- 代價:連接串只能用 IP (如
127.0.0.1),不能用 localhost
三、生產環境配置建議表 (參考值,需實測調整)
| 參數 | 建議值 | 備註 |
| table_open_cache | 512 | 過大致文件描述符耗盡 |
| query_cache_type | 0 (無 MyISAM) / 1 / 2 | 寫入頻繁建議 2 或 0 |
| query_cache_size | 256MB | 按命中率微調 |
| binlog_cache_size | 2-4MB | 大事務可調大 ≤32MB |
| key_buffer_size | 512MB (用 MyISAM 時) | 參考 *.MYI 總大小 |
| bulk_insert_buffer_size | 32MB | 經常批量導入才調大 |
| innodb_buffer_pool_size | 物理內存 50-80% | 核心參數,越大越好 |
| innodb_log_buffer_size | 4-16MB | 高寫入場景調大 |
| innodb_max_dirty_pages_pct | 90 | 平衡刷盤頻率與恢復時間 |
| max_connections | 128-512 | 過大反而拖垮內存 |
| back_log | 128-256 | 應對連接風暴 |
| wait_timeout / interactive_timeout | 120-300 | 清理空閒連接 |
四、常用診斷命令
-- 線程/連接狀態
SHOW GLOBAL STATUS LIKE 'Thread_%';
-- 參數當前值
SHOW GLOBAL VARIABLES LIKE '%buffer%';
SHOW GLOBAL VARIABLES LIKE '%timeout%';
-- InnoDB 狀態
SHOW ENGINE INNODB STATUS\G
-- 慢查詢分析
pt-query-digest /var/log/mysql/slow.log
五、避坑指南
- ❌ 盲目調大所有緩存 → OOM Killer 殺進程
- ❌ 開啟 QC 卻不監控失效率 → 寫入風暴時性能崩塌
- ❌ 忽略
innodb_flush_log_at_trx_commit=1 的 I/O 開銷 → SSD 必須、RAID 卡 BBU 必須
- ✅ 建立基線 → 壓測 → 觀察狀態變量 → 微調單一參數 → 驗證
- ✅ 關鍵指標納入監控:QPS、TPS、緩存命中率、連接使用率、慢查詢數、主從延遲
- 上一篇文章: SQL Server varchar 與 nvarchar 核心差異:字節 vs 字符存儲機制
- 下一篇文章: 400 行 C++ 實現高性能本地 Key-Value 緩存:mmap 持久化、LRU 淘汰、線程安全
Copyright ©
程式碼之家 All Rights Reserved