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

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

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 讨论
热门最新
总结
暂无总结
0 / 600

VPS用着用着突然变卡,网站打开要好几秒、SSH敲命令有明显延迟——这种情况比完全断连更难排查。不是挂了,是慢了。本文用四个命令分别定位CPU、内存、磁盘IO和网络的瓶颈,告诉你性能卡在哪个环节。 排查前的第一步:确认不是自己的网络问题 很

Nginx默认配置能跑,但远不是最优——没有开启Gzip压缩浪费带宽、没有文件缓存每次请求都读磁盘、并发连接数默认只有512在高流量下不够用。花十分钟调几个关键参数,性能和用户体验有明显提升。 开启Gzip压缩——最直接的提速 网页的HTM

1GB内存的VPS跑MySQL+PHP+Nginx,内存用满只是时间问题。加SWAP(虚拟内存)能让系统在内存不够时用磁盘当临时内存用。但它不是免费午餐——SSD的读写速度比内存慢几十倍,SWAP用多了系统卡成狗。 什么时候该加SWAP S

在命令行里敲SQL管理数据库是技术人的浪漫,但偶尔想可视化看看数据、导出一份CSV、或者快速改一行记录——phpMyAdmin是标配。装在VPS上通过浏览器访问,比本地装MySQL客户端方便。 Docker部署phpMyAdmin dock

VPS磁盘满了最常见的表现:网站打不开(MySQL写不进去)、Docker容器启动失败(没空间写日志)、SSH登录巨慢。本文用du和ncdu两个命令找到谁在吃空间,再针对Docker日志、系统日志和旧备份三类大户下手清理。 第一步:确认磁盘