4核8G MySQL能承受多大并发?

这是一个非常经典但没有标准答案的问题。"4 核 8G MySQL 能承受多大并发”完全取决于你的业务场景、SQL 质量、数据量级以及连接模式

在没有任何优化和具体场景的情况下,直接给出一个数字(例如"1000 QPS")是不负责任的。为了让你更清晰地评估,我们需要从以下几个维度进行拆解:

1. 核心瓶颈在哪里?

对于 4 核 8G 的机器,MySQL 的性能瓶颈通常按以下顺序出现:

  • CPU 密集型(最常见):如果 SQL 复杂(多表关联 JOIN、大量计算、排序),4 个 CPU 核心很容易被打满。一旦 CPU 使用率达到 80%-90%,并发能力就会急剧下降。
  • 内存与 Buffer Pool:8G 内存中,MySQL 默认会分配约 50%-75%(即 4G-6G)作为 innodb_buffer_pool。如果你的热点数据能全部放入这个缓存池,读取速度极快;如果数据量大且访问随机,频繁发生磁盘 I/O,性能会断崖式下跌。
  • I/O 瓶颈:如果是机械硬盘,并发能力极低(可能只有几十到几百 QPS);如果是 SSD(NVMe),并发能力可提升数倍甚至十倍。
  • 网络带宽:如果返回的数据包很大(如导出大报表),网卡带宽可能先于 CPU 被占满。

2. 不同场景下的预估范围

假设使用的是 SSD 硬盘SQL 经过基础优化,以下是不同负载类型的经验估算值:

业务场景 典型特征 预估 QPS (每秒查询数) 预估 连接数 (Concurrent Connections) 说明
纯读操作 简单主键查询 (SELECT * FROM table WHERE id=?) 3,000 – 8,000+ 500 – 1,000 只要数据在内存中,4 核 CPU 处理简单查询非常快。
混合读写 典型的 Web 业务(CRUD 各半,有索引覆盖) 1,000 – 3,000 300 – 600 写操作涉及锁竞争和日志写入,是主要瓶颈。
复杂查询 多表 JOIN、无索引全表扫描、GROUP BY < 200 < 50 这种场景下,4 核 CPU 瞬间满载,并发极低。
高并发短连接 大量客户端频繁建立/断开连接 QPS 低,但连接数高 2,000+ (需调优) 连接建立消耗 CPU,若未开启长连接或连接池,系统会卡死。

注意:这里的“并发”通常指 QPS (Queries Per Second),而不是数据库同时建立的 TCP 连接数。实际应用中,我们更关注 QPS。

3. 决定成败的关键变量

同样的配置,为什么有的系统能抗 5000 QPS,有的只能抗 200 QPS?

  1. 索引设计:这是最大的分水岭。有索引的查询走 B+ 树,几乎不耗 CPU;没索引的全表扫描会瞬间吃光 CPU。
  2. SQL 复杂度:简单的 id=1 查询 vs 复杂的 LEFT JOIN 5 张表 + ORDER BY,前者耗时微秒级,后者可能毫秒级。
  3. 连接池策略
    • 错误做法:每个请求都新建一个 MySQL 连接。这会导致上下文切换开销巨大,4 核 CPU 根本扛不住。
    • 正确做法:应用层使用连接池(如 HikariCP),复用连接,将并发连接数控制在合理范围(如 200-300)。
  4. 事务大小:大事务(一次性更新几万条数据)会长时间持有锁,阻塞其他请求,导致整体并发上不去。

4. 如何测试并获取准确数值?

不要猜,要测。你可以使用以下工具模拟真实压力:

  • Sysbench(最常用):

    # 安装 sysbench
    yum install sysbench -y
    
    # 准备数据 (100万行)
    sysbench --mysql-host=localhost --mysql-user=root --mysql-password=xxx 
             --db-driver=mysql --tables=1 --table-size=1000000 oltp_read_write prepare
    
    # 运行压测 (指定线程数,比如 4 核可以试 4, 8, 16 线程)
    sysbench --mysql-host=localhost --mysql-user=root --mysql-password=xxx 
             --db-driver=mysql --threads=16 --time=60 --report-interval=1 
             --oltp-read-only=on --mysql-table-engine=InnoDB 
             oltp_read_write run
  • 观察指标
    • CPU Usage:看是否达到 100%。
    • Threads running:如果超过 CPU 核心数的 2-3 倍,说明上下文切换严重。
    • Innodb row operations:查看每秒插入/更新/删除的数量。
    • Latency:平均响应时间是否在可接受范围内(如 < 50ms)。

5. 针对 4 核 8G 的优化建议

如果你必须在这个配置下支撑高并发,请执行以下操作:

  1. 调整 innodb_buffer_pool_size:设置为物理内存的 50%-70%(约 4G-6G),确保热点数据都在内存中。
  2. 限制最大连接数:不要使用默认的 max_connections (通常是 151)。根据业务设置,例如 max_connections = 200,防止连接风暴拖垮 CPU。
  3. 开启慢查询日志:找出那些执行时间超过 1 秒的 SQL,通过加索引或重写 SQL 来优化。
  4. 使用读写分离:如果读多写少,将只读流量分发到从库(即使是从库也是单机的话,可以分担主库压力)。
  5. 应用层限流:在网关层或代码层做限流,当 QPS 接近阈值时拒绝部分请求,保护数据库不被打挂。

总结

对于 4 核 8G MySQL

  • 理想状态(好索引、简单 SQL、SSD):可支撑 3,000 ~ 8,000 QPS
  • 一般状态(常规 CRUD、中等复杂度):可支撑 1,000 ~ 2,000 QPS
  • 糟糕状态(无索引、复杂 JOIN、机械盘):可能连 100 QPS 都难以稳定维持。

建议:先进行小规模压测(如 Sysbench),监控 CPU 和 IO 曲线,找到具体的瓶颈点后再做针对性优化。