深色模式
MySQL 参数调优
摘要:MySQL 调优不必背参数表,抓住三个大头即可:缓冲池大小、连接数管理、I/O 与线程配置。本文先教你看状态指标,再给出可落地的参数与计算方式。
适用环境
bash
# 先看硬件与当前配置
free -g; nproc
mysql -uroot -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; \
SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';"
# 运行多久了(运行时间短的指标没有参考价值)
mysql -uroot -p -e "SHOW GLOBAL STATUS LIKE 'Uptime';"1
2
3
4
5
6
7
2
3
4
5
6
7
操作步骤
1. 缓冲池 innodb_buffer_pool_size(最重要)
sql
-- 用命中率判断当前配置是否够用
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';1
2
2
命中率 = 1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests,低于 99% 说明偏小。
ini
[mysqld]
innodb_buffer_pool_size = 12G # 独占机器建议物理内存的 50%~70%
innodb_buffer_pool_instances = 4 # 缓冲池 > 8G 时分多个实例减少争用1
2
3
2
3
2. 连接数 max_connections
sql
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Aborted_connects';1
2
3
2
3
ini
max_connections = 1000 # 不要盲目调大,过大内存与上下文切换开销高
thread_cache_size = 64
wait_timeout = 600
interactive_timeout = 6001
2
3
4
2
3
4
危险
把 max_connections 调到几千来掩盖连接泄漏,会让实例在高峰期 OOM。正确做法是配合应用侧连接池治理。
3. Redo 与刷盘策略(性能与安全的取舍)
ini
innodb_flush_log_at_trx_commit = 1 # 每次提交刷盘,最安全
sync_binlog = 1 # 与上面配合,保证崩溃不丢事务
innodb_flush_method = O_DIRECT1
2
3
2
3
sql
-- 从库或可容忍丢少量数据的场景可放宽(需业务确认)
SET GLOBAL innodb_flush_log_at_trx_commit = 2;
SET GLOBAL sync_binlog = 1000;1
2
3
2
3
4. I/O 与线程相关
ini
innodb_io_capacity = 1000 # SSD 可设 1000~4000,机械盘 200 左右
innodb_log_file_size = 2G # 写密集场景适当调大,减少 checkpoint
innodb_read_io_threads = 8
innodb_write_io_threads = 81
2
3
4
2
3
4
5. 在线修改与持久化
sql
SET GLOBAL max_connections = 1000; -- 立即生效,重启失效
SET PERSIST max_connections = 1000; -- MySQL 8.0:持久化到 mysqld-auto.cnf
RESET PERSIST max_connections; -- 撤销持久化1
2
3
2
3
验证
bash
# 用 sysbench 或业务压测对比 QPS/RT
sysbench oltp_read_write --mysql-host=127.0.0.1 --mysql-user=root --mysql-password=密码 \
--tables=8 --table-size=100000 --threads=32 --time=60 run1
2
3
2
3
sql
-- 观察调优前后关键指标
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
SHOW GLOBAL STATUS LIKE 'Threads_running';1
2
3
2
3
常见坑
WARNING
参数不是越大越好:innodb_buffer_pool_size 超过物理内存会触发 swap,性能断崖式下降;必须给操作系统和其他进程留内存。
WARNING
innodb_log_file_size 修改需停库并删除旧 redo 文件(MySQL 8.0 已支持自动重建,但仍建议先备份并在低峰操作)。
DANGER
生产环境改参数应一次只改一项、观察后再改下一项;一次性改一堆会导致无法定位问题,且回滚困难。