我这台小 VPS(1 核 1G 左右内存)跑 WordPress,用的是 AMH 面板 + LNMP,数据库是 mysql-generic-8.0。这种配置最大的矛盾很现实:MySQL、PHP-FPM、Redis、Nginx 都要活着,但内存就那么一点点,稍微一波访问就容易 swap、卡顿,甚至 PHP-FPM 一个进程飙 CPU/内存把机器拖死。
所以我给 MySQL 的策略不是“性能拉满”,而是:
- 稳:不爆内存,不轻易触发 swap 抖动
- 够用:满足 WordPress 常见读写
- 可控:参数简单,能在 AMH 里直接粘贴,不用手改一堆
下面记录我这次在 AMH 面板 → MySQL → 参数配置/编辑配置 里调整 MySQL 的过程、思路和最终配置。
1)先说结论:WordPress 场景下,MySQL 8 应该以 InnoDB 为核心
我当时在 AMH 的“中等配置”里看到一行:
default-storage-engine = MyISAM
这在 MySQL 8 + WordPress 上不太合理:
- WordPress 核心表基本都用 InnoDB(事务、崩溃恢复、行级锁)更合适
- MyISAM 在并发写入、锁竞争、崩溃恢复方面都不友好
- MySQL 8 默认其实就是 InnoDB
我也用命令确认过运行时变量(当时查询结果里已经是 InnoDB):
default_storage_engine = InnoDB
所以配置层面我也把它写成 InnoDB,避免“配置写 MyISAM、实际跑 InnoDB”这种割裂状态。
2)我关心的几个关键参数:小内存下要盯住这几项
在 1G 内存的机器上,我重点看的就是:
(1)innodb_buffer_pool_size(核心)
这是 MySQL 内存大头。太大了会挤死 PHP-FPM;太小了数据库命中率差但至少不死。
我的原则:给 InnoDB 128M~256M 这个级别,优先保证系统整体稳定。
(2)max_connections(别给太大)
WordPress 的连接通常来自 PHP-FPM。你机器 1 核 + 1G,开 200 连接只会把自己拖死。
我的原则:30~60 足够,必要时再加。
(3)table_open_cache(适中即可)
过小会频繁 open/close 表;过大又浪费内存。
我的原则:128 或 256。
(4)max_allowed_packet(别搞得太极端)
太小会导致导入/插件操作失败;太大意义也不大。
我的原则:32M(比默认 16M 更稳妥一些)。
3)AMH 面板里怎么改:直接替换“编辑配置”内容
AMH 的好处是它提供了一个“编辑配置”文本框,你可以直接把整段 my.cnf 风格内容粘进去。
我不想一条条点下拉框,所以就用“整段替换”的方式,一次到位。
下面这份就是我给 小内存 WordPress 服务器准备的版本(你可直接复制粘贴到 AMH 的编辑配置里)。
4)最终配置(可直接复制)
说明:按你面板里 mysql-generic-8.0 的路径/命名习惯写的,保持 socket、datadir、pid-file 这些 AMH 自己的字段不动,只把关键性能参数调整到更“稳”的区间。
[client]
port = 3306
socket = /tmp/mysql-generic-8.0.sock
[mysqld]
# 基础路径(保持 AMH 原配置)
port = 3306
socket = /tmp/mysql-generic-8.0.sock
lc-messages-dir = /usr/local/mysql-generic-8.0/share
basedir = /usr/local/mysql-generic-8.0
datadir = /home/usrdata/mysql-generic-8.0
pid-file = /home/usrdata/mysql-generic-8.0/mysql.pid
# 安全/兼容
skip-external-locking
skip-networking
sql_mode='NO_ENGINE_SUBSTITUTION'
default_authentication_plugin = caching_sha2_password
disable_log_bin
# ✅ 关键:WordPress 建议用 InnoDB
default-storage-engine = InnoDB
# 连接与缓存(小内存稳一点)
max_connections = 30
table_open_cache = 128
# 传输包(避免某些导入/插件操作失败)
max_allowed_packet = 32M
# InnoDB 内存(1G 机器建议 128M~256M;先用 128M 更稳)
innodb_buffer_pool_size = 128M
innodb_log_buffer_size = 8M
innodb_open_files = 200
# 一些连接级 buffer:别给太大(并发一上来会放大内存占用)
sort_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
net_buffer_length = 8K
thread_stack = 256K
# MyISAM 相关(基本用不到,但留小一点避免浪费)
key_buffer_size = 8M
myisam_sort_buffer_size = 8M
server-id = 1
[mysqldump]
quick
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
5)改完怎么验证:别信面板,要看运行时变量
我改完后,会用 MySQL 直接查运行时值(避免“配置写了但没生效”):
mysql -uroot -p -S /tmp/mysql-generic-8.0.sock -e \
"SHOW VARIABLES WHERE Variable_name IN ('default_storage_engine','innodb_buffer_pool_size','max_connections','table_open_cache','max_allowed_packet');"
重点看这几项是不是你期望的:
default_storage_engine是否是InnoDBinnodb_buffer_pool_size是否按你设定(例如 134217728 = 128M)max_connections是否为 30table_open_cache是否为 128max_allowed_packet是否约 33554432(32M)
6)我为什么这么配:一句话总结
1G 内存的 WordPress 机器,MySQL 的正确打开方式不是“提速”,而是“别抢资源”。
把 InnoDB 用对、把 buffer_pool 限住、把连接数收敛住,整体才稳