MySQL默认装完是面向兼容性的保守配置——1核512MB的小VPS和16核64G的服务器用的同一套默认参数。结果就是小VPS上MySQL把内存吃满触发OOM Killer,大服务器上内存利用率不到20%。根据实际内存调几个关键参数,性能改善立竿见影。
找出当前配置
# 看关键内存参数当前值
mysql -u root -p -e "SHOW VARIABLES LIKE '%buffer_pool%';"
mysql -u root -p -e "SHOW VARIABLES LIKE '%innodb%';" | grep -E 'buffer|log_file'
# 看当前实际使用情况
mysql -u root -p -e "SHOW ENGINE INNODB STATUSG" | grep -A5 "BUFFER POOL"innodb_buffer_pool_size——最关键的参数
InnoDB缓冲池是MySQL内存占用的大头。数据先读到缓冲池再处理,缓冲池越大能缓存的数据越多、磁盘IO越少。默认128M,对于1GB以上内存的VPS来说太小了。
推荐值:VPS总内存的50%-70%。1GB内存VPS设512M,2GB设1G,4GB设3G。设太大MySQL启动不了——因为操作系统本身也要用内存。编辑my.cnf:
[mysqld]
innodb_buffer_pool_size = 512M # 1GB内存VPS设512M
innodb_buffer_pool_instances = 1 # 小于1GB的缓冲池设1个实例
雨云入门VPS起步1核1G,优惠码 admin01 首月五折。跑WordPress+MySQL,2G内存更舒服。
其他几个值得调的参数
# 慢查询日志——找到拖慢数据库的SQL
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 # 超过2秒的查询记下来
# 连接数
max_connections = 50 # 小VPS别设太高,每个连接吃内存
# 表缓存
table_open_cache = 256
# InnoDB日志大小
innodb_log_file_size = 128M # 写密集场景加大可减少磁盘IO分析慢查询——优化真正该优化的
慢查询日志记录了所有执行时间超过long_query_time的SQL。用mysqldumpslow工具分析:
# 看最慢的10条查询
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
# 看出现次数最多的10条
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log对于频繁出现的慢查询:用EXPLAIN看执行计划——有没有用索引、扫描了多少行、有没有全表扫描。频繁全表扫描→加索引。索引不是越多越好——每次写入都要更新索引,索引太多反而拖慢写入性能。
索引优化原则
- 在WHERE和JOIN的字段上加索引
- 联合索引注意最左前缀——WHERE a=1 AND b=2,索引(a,b)有效,索引(b,a)对这个查询无效
- 用小字段做索引——INT比VARCHAR快,前缀索引节省空间
- EXPLAIN里type=ALL说明全表扫描→检查有没有漏加索引
- 定期ANALYZE TABLE更新索引统计信息让优化器做对选择
天天检查的健康指标
# 缓冲池命中率——理想值>99%
mysql -e "SHOW ENGINE INNODB STATUSG" | grep "Buffer pool hit rate"
# 如果低于95%,缓冲池太小需要加大
# 慢查询占比
mysql -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';"
# 如果持续增长,有SQL需要优化常见问题
改了my.cnf后MySQL起不来?
innodb_buffer_pool_size设太大超过系统可用内存→MySQL启动失败。journalctl -u mysql看启动日志确认OOM。减小参数值或用systemctl start mysql手动启动看报错。
WordPress网站数据库慢怎么定位?
装Query Monitor插件→在WordPress后台实时看每条数据库查询的执行时间和调用位置。90%的慢查询来自没索引的wp_postmeta表→给meta_key和post_id加联合索引。
内存够用要不要调MySQL配置?
要。默认128M缓冲池连2G内存的VPS都喂不饱——空着的内存不用就是浪费。调大缓冲池后数据库操作从磁盘读变内存读,速度差距是数量级的。






