VPS上MySQL配置优化:内存参数、慢查询日志和索引建议

按VPS内存调整buffer_pool、开慢查询日志分析、EXPLAIN看执行计划和索引优化
发布于
17

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看执行计划——有没有用索引、扫描了多少行、有没有全表扫描。频繁全表扫描→加索引。索引不是越多越好——每次写入都要更新索引,索引太多反而拖慢写入性能。

索引优化原则

  1. 在WHERE和JOIN的字段上加索引
  2. 联合索引注意最左前缀——WHERE a=1 AND b=2,索引(a,b)有效,索引(b,a)对这个查询无效
  3. 用小字段做索引——INT比VARCHAR快,前缀索引节省空间
  4. EXPLAIN里type=ALL说明全表扫描→检查有没有漏加索引
  5. 定期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都喂不饱——空着的内存不用就是浪费。调大缓冲池后数据库操作从磁盘读变内存读,速度差距是数量级的。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 / 600
0 讨论
热门最新
总结
暂无总结

暂无数据