Linux 上 MySQL 配置优化实操指南
一 基线评估与配置入口
systemctl restart mysqld 重启,并用 SHOW VARIABLES LIKE 'xxx'; 验证。二 核心参数优化清单
innodb_buffer_pool_instances=4-8。监控缓冲池命中率目标 ≥99%。innodb_buffer_pool_size=12Gkey_buffer_size=256M);MySQL 8 默认以 InnoDB 为主,可保守设置。thread_cache_size=50-100 减少线程创建开销。max_connections=500sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size,避免“连接数 × 每连接缓冲”造成内存膨胀。innodb_log_file_size=1G,innodb_log_files_in_group=2innodb_flush_log_at_trx_commit=1(最安全);读多写少且可接受秒级丢失时可权衡 2。innodb_flush_method=O_DIRECT(绕过 OS 页缓存,减少双重缓存)。innodb_io_capacity=2000+,高端 NVMe 可更高;必要时提高 innodb_io_capacity_max。innodb_doublewrite=1 为默认且更安全;在具备 电池保护/超级电容 的高端 SSD/NVMe 上,为追求吞吐可关闭,但需充分评估风险。query_cache_type=0; query_cache_size=0)。tmp_table_size 与 max_heap_table_size(如各 64M-256M),避免磁盘临时表激增。innodb_parallel_read_threads=2-4)、合理调整 自适应哈希索引 与 变更缓冲 策略。三 不同场景的推荐配置
[mysqld]
innodb_buffer_pool_size=8G
innodb_buffer_pool_instances=8
innodb_log_file_size=1G
innodb_log_files_in_group=2
innodb_flush_method=O_DIRECT
innodb_io_capacity=2000
innodb_io_capacity_max=4000
innodb_flush_log_at_trx_commit=1
max_connections=500
thread_cache_size=100
[mysqld]
innodb_buffer_pool_size=16G
innodb_change_buffering=all
innodb_change_buffer_max_size=50
innodb_read_io_threads=8
innodb_write_io_threads=4
innodb_parallel_read_threads=4
tmp_table_size=256M
max_heap_table_size=256M
innodb_read_only=1 # 只读副本
[mysqld]
innodb_buffer_pool_size=物理内存的50%-70%
innodb_log_file_size=512M-1G
innodb_flush_method=O_DIRECT
innodb_io_capacity=2000
innodb_flush_log_at_trx_commit=1
max_connections=200-500
thread_cache_size=50-100
slow_query_log=1
long_query_time=1
四 Linux 系统层优化
echo deadline > /sys/block/sda/queue/scheduler。ulimit -n(如 65536),并在 /etc/security/limits.conf 与 PAM 中持久化。numactl --interleave=all 启动 mysqld)或在 mysqld_safe 中启用 innodb_numa_interleave=1,缓解跨 NUMA 访问不均。vm.swappiness 适当降低(如 10-30),减少不必要的 swap。五 监控验证与常见误区
SELECT (1 - SUM(IF(VARIABLE_NAME='Innodb_buffer_pool_reads',VARIABLE_VALUE,0)) /
SUM(IF(VARIABLE_NAME='Innodb_buffer_pool_read_requests',VARIABLE_VALUE,0))
) * 100 AS hit_rate
FROM information_schema.GLOBAL_STATUS
WHERE VARIABLE_NAME IN ('Innodb_buffer_pool_reads','Innodb_buffer_pool_read_requests');
Threads_connected、Threads_cached、Max_used_connections。Created_tmp_disk_tables、Created_tmp_tables。SHOW ENGINE INNODB STATUS\G、SHOW STATUS LIKE 'Innodb_row_lock%';。slow_query_log=1、long_query_time=0.5-1;用 mysqldumpslow 或 pt-query-digest 分析并优化执行计划、索引与语句写法。SET GLOBAL innodb_buffer_pool_size=...;);但 innodb_log_file_size 等需按流程重启变更。max_connections 导致内存与上下文切换开销激增。innodb_buffer_pool_size 引发 OOM/swap。innodb_flush_method=O_DIRECT 导致双重缓存。