InnoDB 參數預設值極小(如 innodb_buffer_pool_size=8M),生產環境必須按業務與硬體調優。本文按內存、日誌、IO、其他四大維度系統梳理核心參數與調優邏輯。
[mysqld]
# 連接層
max_connections = 800
# 緩存層(MyISAM/通用)
key_buffer_size = 512M
query_cache_size = 128M # 8.0 已移除,慎用
sort_buffer_size = 64M
table_open_cache = 512
# 線程私有緩存
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
# InnoDB 核心
innodb_buffer_pool_size = 10G # 專用DB佔物理內存 70-80%
innodb_flush_log_at_trx_commit = 1 # ACID嚴格模式,主庫不可改
innodb_file_per_table = 1 # 獨立表空間
innodb_open_files = 4096 # 配合大量表
# Binlog
expire_logs_days = 30
log-bin = mysql-bin
SHOW ENGINE INNODB STATUS\G 中 BUFFER POOL AND MEMORY 區段 Total memory allocated。SHOW ENGINE INNODB STATUS 觀察 in additional pool allocated。Innodb_os_log_written 增長速率調整。1(預設):每提交 fsync,完全 ACID,性能最低2:寫文件不 fsync,每秒 fsync,掉電丟 1 秒數據0:不寫文件,每秒寫入並 fsync,崩潰丟 1 秒數據table_open_cache。autoextend,跨磁盤分布可提升 IO 並行。(num_disks + num_cpus) * 2,或設 0/1000 禁用限制。SHOW GLOBAL STATUS、SHOW ENGINE INNODB STATUS、iostat、vmstat 基線sysbench/tpcc-mysql 模擬業務負載innodb_flush_log_at_trx_commit 改為 0/2 導致數據丟失風險innodb_file_per_table 導致 ibdata1 無限增長expire_logs_days 導致 Binlog 佔滿磁盤InnoDB 調優無銀彈,唯有「理解原理 → 建立基線 → 小步快跑 → 持續觀測」方得最優解。