云服务器 MySQL 搭建 + 调优全套指南(通用 Linux:CentOS / Ubuntu / Debian,MySQL5.7 / 8.0)
云服务器 MySQL 搭建 + 调优全套指南(通用 Linux:CentOS / Ubuntu / Debian,MySQL5.7 / 8.0)
前提说明:云服务器要先做基础安全:安全组放行3306(不建议对公网全开3306,优先内网连接、SSH隧道),系统磁盘区分系统盘和数据盘,数据库数据目录挂载到数据盘,避免系统盘满库挂掉。
下面分为:部署注意事项、核心配置调优、SQL层面调优、操作系统内核调优、日常监控维护、避坑清单。云服务器怎么选:https://act.tag.org.cn
一、搭建阶段(云服务器特有重点)
- 磁盘选型(最重要,很多人踩坑)
- MySQL 极度依赖随机IO:优先选SSD/ESSD,不要用普通机械云盘;
- 数据目录
datadir迁移到独立数据盘,不要放系统盘; - 磁盘挂载参数:
defaults,noatime,nodiratime,关闭文件访问时间记录,减少IO。
- 内存规划公式(核心)
InnoDB 是MySQL默认存储引擎,绝大多数业务只用InnoDB
innodb_buffer_pool_size = 服务器可用内存 50% ~ 70%- 小机器(2G):不要超过 1G;
- 4G:2G~2.8G;
- 8G:4G~6G;
- 16G:8G~12G;
- 剩余内存留给:系统、连接线程、排序缓冲、临时表、操作系统PageCache。
❌ 不要设置超过物理内存,会OOM被云服务器内核杀掉。
- 连接规划
max_connections不是越大越好,默认151,很多人直接改10000,极易OOM。- 小型业务:200~500
- 中业务:500~1000
- 高并发需要更多连接 → 优先用连接池(Java HikariCP、PHP Swoole连接池),而不是放大max_connections

二、my.cnf / my.ini 核心参数调优([mysqld]段)
路径:一般
/etc/my.cnf(CentOS) //etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)
修改后:systemctl restart mysqld,务必先备份原配置
[mysqld]
基础
user=mysql
datadir=/data/mysql 放到独立数据盘
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
port=3306
default-storage-engine=InnoDB
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
内存核心(重中之重)
innodb_buffer_pool_size = 4G
多实例buffer_pool拆分,建议每块不大于1G,4G就设4
innodb_buffer_pool_instances = 4
buffer pool预热,重启后自动加载热点数据
innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup = ON
IO相关(SSD云盘推荐)
innodb_flush_log_at_trx_commit = 1
1:最安全,每次事务刷盘;2:折中,每秒刷一次,性能高一点,故障最多丢1秒数据;0:不推荐
sync_binlog = 1
innodb_file_per_table = ON 每张表独立ibd文件,删表释放空间
innodb_flush_method = O_DIRECT 绕过操作系统缓存,防止双缓存占用内存,SSD必开
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
redo log总大小=2G,不要太大,太大崩溃恢复慢;高并发可到2G单个
连接、会话缓冲
max_connections = 500
wait_timeout = 600
interactive_timeout = 600
空闲连接10分钟自动断开,防止僵死连接占满
sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 1M
read_rnd_buffer_size = 2M
注意:这几个是【每个连接单独分配】,不要设很大!16M、32M很容易内存爆炸
临时表
tmp_table_size = 64M
max_heap_table_size = 64M
超过这个大小,临时表落地磁盘,变慢;两个值保持一致
慢查询日志(必开,用来抓慢SQL)
slow_query_log = ON
slow_query_log_file = /data/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = ON
binlog(主从/数据恢复必备)
log_bin = /data/mysql/binlog/mysql-bin
binlog_format = ROW
expire_logs_days = 7 自动清理7天前binlog,防止磁盘打满
binlog_row_image = minimal 减少binlog体积,MySQL8.0支持
InnoDB其他
innodb_autoinc_lock_mode = 2 高并发插入自增,MySQL8默认2
innodb_stats_on_metadata = OFF 关闭元信息查询自动统计,show table status快很多
关闭DNS解析,云服务器内网环境加速
skip-name-resolve
MySQL8.0 注意:部分参数废弃,
expire_logs_days换成binlog_expire_logs_seconds
三、操作系统层面调优(云服务器Linux,非常容易忽略)
- 内核参数
/etc/sysctl.conf
增大文件句柄,MySQL连接多会打开大量文件
fs.file-max = 655350
减少swap使用,MySQL服务器强烈建议swappiness=1
vm.swappiness = 1
脏页刷写调整
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
网络参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
生效:sysctl -p
- 资源限制
/etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535
作用:放开mysql用户打开文件数限制,不然报 Too many open files
- 关闭swap(推荐数据库服务器)
云服务器内存不足时swap会疯狂读写,数据库直接卡死。
临时关闭:swapoff -a
永久注释/etc/fstab的swap行。
四、SQL & 索引层面调优(80%性能瓶颈在这里,配置只是辅助)
- 强制所有大SQL看执行计划:
explain select ...- type 最好
ref/range;避免ALL全表扫描 - key 要有索引,Extra 避免
Using filesort、Using temporary
- type 最好
- 索引原则
- 联合索引:最左前缀原则;不要建立大量冗余索引
- 索引字段尽量小,字符串长字段用前缀索引
- 禁止在索引列做函数计算:
where DATE(create_time)='xxx'会失效
- 规范写法
- 禁止
select - 分页大偏移:
limit 100000,10极慢,改成主键ID书签分页 - 批量插入用
insert into values (),(),(),不要循环单条insert - 大事务拆分,不要一次性更新几万行,锁表、redo log压力巨大
- 禁止
- 锁相关
- InnoDB行锁依赖索引,不走索引会退化成表锁
- 业务尽量短事务:少在事务里面做sleep、http调用
五、云服务器专属优化点
- 快照/备份策略
- 不要业务高峰打云盘快照;快照会短暂拉高IO
- 数据库逻辑备份:
mysqldump或者mydumper,大库优先物理备份(xtrabackup)
- 云盘性能限制
很多云盘有IOPS、带宽配额,高峰期打满后会限流,表现为数据库突然变卡,看云监控的磁盘IOPS、磁盘等待%util - 内网访问优先
应用服务器和MySQL放同一个VPC内网,不走公网,延迟低、安全;公网3306尽量不放行,需要远程管理用SSH隧道。 - 弹性伸缩思路
- 读多写少:主从分离,读请求走从库
- 单库压力太大:分库分表
六、监控 & 诊断命令(日常排查)
看实时线程、连接、锁
mysql -uroot -p
show processlist;
show engine innodb status;
看buffer pool命中率(核心指标)
show status like 'Innodb_buffer_pool_read%';
命中率公式:(1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) 100%
理想 >99%,低于95%说明buffer pool太小或者热点数据太多
看慢查询
tail -f /data/mysql/slow.log
工具:pt-query-digest 分析慢日志(percona-toolkit)
系统层面看IO瓶颈
iostat -x 1
top
htop
七、常见坑清单
- innodb_buffer_pool_size 设置太大,吃掉系统内存,触发OOM杀MySQL
- sort_buffer_size / join_buffer_size 设置几十M,每个连接都分配,瞬间内存爆炸
- max_connections盲目拉到几千,连接数上来直接OOM
- 数据放在系统盘,日志、binlog疯狂写入,系统盘爆满数据库宕机
- 机械盘跑MySQL,IO天生瓶颈,怎么调参数都没用
- 忘记开binlog或者没设置自动清理,binlog占满磁盘
- 公网直接暴露3306,被扫库、拖库
- 长事务不提交,导致undo膨胀、锁等待
八、简单调优流程总结
- 选SSD、独立数据盘挂载,挂载参数 noatime
- 按内存计算 innodb_buffer_pool_size(50%-70%)
- 配置文件:redo log、binlog、慢查询、超时时间
- 系统:swappiness=1、调高nofile句柄
- 上线后:抓慢SQL、加索引、优化业务SQL
- 监控:buffer pool命中率、磁盘IO、连接数、慢查询
),我可以直接给你一份适配好、复制即用的 my.cnf 完整配置。

云服务器 MySQL 搭建 + 调优全套指南(通用 Linux:CentOS / Ubuntu / Debian,MySQL5.7 / 8.0)
> 前提说明:云服务器要先做基础安全:安全组放行3306(不建议对公网全开3306,优先内网连接、SSH隧道),系统磁盘区分系统盘和数据盘,数据库数据目录挂载到数据盘,避免系统盘满库挂掉。
> 下面分为:部署注意事项、核心配置调优、SQL层面调优、操作系统内核调优、日常监控维护、避坑清单。
浙公网安备 33010602011771号