直接给结论:在阿里云 1核1G(单核,1GB内存)的配置下,MySQL 的并发连接数建议控制在 20-50 个以内,且“有效并发”(即同时执行复杂查询的连接)通常不超过 5-10 个。
如果强行开启高并发(比如 100+),数据库会迅速进入 CPU 100% 或 OOM(内存溢出)状态,导致服务假死。
下面从技术原理、实际瓶颈和调优方案三个维度拆解,不整虚的,只讲干货。
一、 为什么 1核1G 这么脆弱?
很多人对“并发”有误解,以为 max_connections 设成 1000 就能扛住 1000 人访问。在 1C1G 这种入门级配置上,这是灾难性的想法。
1. 内存是硬伤(最核心瓶颈)
MySQL 是进程/线程模型,每个连接都会占用内存。
- 连接开销:一个空闲的 MySQL 连接大约占用 2-4MB 内存(取决于版本和配置)。
- 缓冲池:InnoDB Buffer Pool 是性能关键。如果设为 128M,数据都在磁盘 IO;如果设为 512M,只剩一半给 OS 和其他进程。
- 计算:
- 系统保留:约 200MB(OS + Swap + Nginx/Apache 等前置服务)。
- 可用给 MySQL:约 800MB。
- 假设平均每个活跃连接消耗 10MB(含临时表、排序等):$800 / 10 = 80$ 个连接。
- 现实更残酷:一旦涉及 Join、Order By、Group By,临时表可能产生在内存中,瞬间吃掉几十 MB。所以安全值远低于理论值。
2. CPU 是单核地狱
- 1 核意味着只有一个逻辑 CPU 核心处理所有 SQL 解析、执行、锁竞争。
- MySQL 本身是多线程的,但遇到
LOCK TABLES、MyISAM 表锁或严重的 InnoDB 行锁竞争时,其他线程只能排队。 - 单核 CPU 在处理复杂 SQL 时,很容易出现上下文切换频繁,导致吞吐量断崖式下跌。
3. 网络与 IO
- 1C1G 通常搭配的是高效云盘或 SSD,IOPS 有限。
- 如果并发上来,大量随机读,磁盘 IO Wait 升高,CPU 反而闲下来了,但响应时间极慢。
二、 不同场景下的真实并发能力
| 场景 | 预估稳定并发连接数 | 说明 |
|---|---|---|
| 纯静态页面 + 简单查询 | 20-30 | 无缓存,每次查 DB,很快崩 |
| 使用 Redis/Memcached 缓存热点数据 | 50-80 | 大部分请求被缓存拦截,DB 压力小 |
| 复杂业务(多表 JOIN、分页深翻页) | 5-10 | 任何超过 10 个同时执行复杂 SQL 的请求,延迟都会飙升到秒级 |
| 突发流量(秒杀/活动) | < 5 | 必须靠前端限流、降级,DB 根本扛不住 |
注意:这里的“并发”指的是同时处于活跃状态并执行 SQL 的连接数,而不是 TCP 层面的连接总数。你可以建立 1000 个 TCP 连接,但如果它们都在等待或空闲,问题不大;如果都发 SELECT,那就炸了。
三、 如何优化 1C1G 上的 MySQL?
如果你预算有限,只能用 1C1G,以下是必须做的优化步骤:
1. 修改 my.cnf 关键参数
不要使用默认配置!默认配置是为大内存服务器设计的。
[mysqld]
# 最大连接数:根据内存估算,1C1G 建议 100-200,别开太大
max_connections = 150
# 每个连接的最大内存分配(关键!防止 OOM)
# thread_stack 默认 192K,可适当降低,但别低于 128K
thread_stack = 192K
# 临时表大小:限制在内存中,避免写磁盘
tmp_table_size = 16M
max_heap_table_size = 16M
# InnoDB 缓冲池:设置为可用内存的 40%-50%
# 1G 内存,建议 128M - 256M。太小没性能,太大会挤占 OS 空间
innodb_buffer_pool_size = 128M
# 日志文件:关闭不必要的日志,提升性能
log_bin = off # 非主库可关闭,减少 IO
slow_query_log = on
long_query_time = 2
# 禁用 DNS 解析检查(加快连接速度)
skip-name-resolve = 1
2. 应用层优化(比改 DB 配置更重要)
- 连接池:在 Java (HikariCP)、Python (SQLAlchemy) 或 PHP (PDO) 中使用连接池,复用连接,避免频繁创建销毁。
- 缓存优先:引入 Redis。对于读多写少的数据,90% 的请求不应打到 MySQL。
- SQL 优化:
- 禁止
SELECT *,只查需要的字段。 - 避免深分页(
LIMIT 100000, 10),改用 ID 范围查询。 - 确保所有 WHERE 条件都有索引。
- 避免在 MySQL 中做复杂计算,移到应用层。
- 禁止
3. 架构层面:读写分离 + XX
- 如果确实需要更高并发,考虑使用阿里云 PolarDB-X 或自建 ProxySQL/MaxScale。
- 将读请求分流到只读实例(如果有),写请求集中在主库。
四、 常见误区澄清
❌ 误区 1:“我把 max_connections 设成 1000,就能支持 1000 并发。”
✅ 真相:这只是允许你建立这么多连接,不代表能处理这么多请求。1C1G 会在第 50 个并发请求到来时就因资源耗尽而拒绝服务。
❌ 误区 2:“用 MyISAM 引擎更快。”
✅ 真相:MyISAM 不支持事务和行锁,在高并发写入时会发生表锁,导致整个数据库不可用。InnoDB 虽然稍重,但支持行锁,更适合现代 Web 应用。
❌ 误区 3:“1C1G 跑不了 WordPress。”
✅ 真相:可以跑,但必须配合:
- 全页缓存插件(如 WP Super Cache)
- 对象存储替代媒体上传
- 精简主题和插件
否则,日 PV 超过 500 就可能卡顿。
五、 总结与建议
1C1G 是典型的“入门级”配置,适合:
- 个人博客、小型展示型网站
- 内部管理系统(用户少)
- 开发测试环境
不适合:
- 电商、社交、实时交互类应用
- 日均 PV > 5000 的网站
- 任何对响应时间要求低于 500ms 的生产环境
最终建议:
如果你的业务正在增长,不要纠结于在 1C1G 上压榨极限。阿里云的 ECS 升级成本不高,或者直接使用 RDS MySQL 基础版(虽然贵点,但自动备份、监控、高可用省心)。对于生产环境,最低起步推荐 2核4G,这才是 MySQL 能舒适工作的起点。
云技术博客