网络宝典
第二套高阶模板 · 更大气的阅读体验

MySQL连接池大小设置:别让数据库拖了应用后腿

发布时间:2025-12-16 04:08:56 阅读:158 次

做Web开发时,经常听到“连接”这个词,特别是在和MySQL打交道的时候。你可能已经写好了查询语句,接口也跑通了,但一到高并发就卡顿、超时,问题很可能出在连接池大小没调好。

连接池是啥?

想象一下银行柜台,客户来了要办业务,柜员就是数据连接。如果每次来人都临时叫一个柜员上班,效率肯定低。于是银行决定提前安排几个柜员待命,谁来就直接服务——这就是连接池。它预先建立好一批数据库连接,等程序要用的时候直接拿,用完放回去,不用每次都重新连接。

为什么连接池大小很重要?

设得太小,比如只有5个连接,但网站突然来了100个用户同时请求数据,那80多个请求只能干等着,页面就卡住了。设得太大,比如500个,MySQL可能扛不住,直接报错“Too many connections”,服务器内存也被吃光,反而拖垮整个系统。

MySQL默认最大连接数一般是151,最多能撑到几千,但每个连接都会消耗内存和CPU资源。实际项目中,不是越多越好,而是要匹配你的业务场景。

怎么定一个合适的值?

先看你的应用类型。如果是内部管理系统,一天几百访问量,连接池设20~30就够了。但要是电商秒杀活动,瞬时并发上千,那就得仔细算。

有个经验公式可以参考:连接池大小 = (平均请求处理时间 × 并发请求数)/ 请求响应时间。更简单点,可以用监控工具看看高峰期数据库连接的使用情况。比如用Prometheus + Grafana,或者直接查MySQL状态:

SHOW STATUS LIKE 'Threads_connected';

这个命令能告诉你当前有多少连接正在用。如果经常接近你设的上限,就得考虑扩容。

常见框架里的配置示例

比如用Java的HikariCP,配置看起来像这样:

spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5

这里最大20个连接,适合中小项目。如果发现日志里频繁出现“connection timeout”,说明不够用了。

Python用SQLAlchemy配合pymysql的话:

from sqlalchemy import create_engine

engine = create_engine(
    "mysql+pymysql://user:pass@localhost/db",
    pool_size=10,
    max_overflow=20
)
# 实际最大连接数是 pool_size + max_overflow = 30

注意max_overflow不是随便写的,它代表超出基础池大小后还能临时创建多少连接,超过就会排队。

别忘了调整MySQL本身的限制

你程序里设了100个连接,但MySQL自己只允许50个,那就白搭。进MySQL改配置:

SET GLOBAL max_connections = 200;

还要记得在my.cnf里持久化这个设置,不然重启就回去了。

线上调优要小心

曾经有个同事把连接池从20直接拉到200,结果第二天数据库负载飙到90%,CPU一直满载。查下来发现是大量空闲连接占着资源没释放。后来加上idle-timeout和max-lifetime控制,才稳住。

连接池不是设完就一劳永逸,得结合监控看。比如每天早晚高峰有没有连接等待?有没有频繁创建销毁连接?这些都能反映配置合不合理。