首页/数据/数据库速查/连接线程复用(thread_cache_size)
性能与调优57 条

连接线程复用(thread_cache_size)

连接风暴的缓冲垫:断开后线程进缓存供复用,省去反复创建线程的开销;默认值偏低,高并发短连接场景容易被反复创建拖慢。

数据库速查数据更新于 2026-10-13

thread_cache_size 是什么

MySQL 每建立一个客户端连接就要分配一个线程,断开后线程不立刻销毁,而是放进线程缓存供下次复用。thread_cache_size 决定缓存多少个空闲线程:缓存命中就不必反复创建销毁线程,能明显降低短连接场景的连接开销。

基本信息

参数名thread_cache_size
作用域GLOBAL,支持动态修改,重启后以配置文件为准
取值建议短连接多的实例给 32 到 128,按创建线程的增速继续调整
内存代价缓存线程常驻占用内存(线程栈等结构)
判定指标Threads_created 增速与 Connections 增速的比值

典型使用场景

  • 短连接业务:请求级建连的架构每次连接都要建线程,缓存收益最明显
  • 连接抖动大:并发峰谷差距大时用缓存吸收建连尖峰
  • 线程创建数持续增长:说明缓存不够,线程在不断重建销毁
  • 压测环境对齐生产:先用缓存参数还原真实建连成本,再评估容量
  • 长连接池业务:收益有限,重点应放在连接池配置与正在运行的线程数上

状态与调整

状态与调整
SHOW STATUS LIKE 'Threads_%';        -- 连接与线程状态
SHOW STATUS LIKE 'Connections';      -- 累计连接数
SHOW VARIABLES LIKE 'thread_cache_size';
SET GLOBAL thread_cache_size = 64;   -- 动态调大,同时写进配置文件
-- 调完继续观察 Threads_created 是否仍随 Connections 同步暴涨

输出逐列读法

状态变量含义判读
Threads_connected当前打开的连接数接近上限需排查连接泄漏
Threads_running正在执行的线程数明显大于 CPU 核数说明存在排队
Threads_created累计创建过的线程数增速接近连接增速说明缓存命中率低
Threads_cached当前缓存中的空闲线程数长期为 0 说明缓存偏小
评估缓存是否够用:比较一段时间内创建线程增量与连接增量的比值,比值接近 1 说明几乎没有复用,应继续调大。
缓存线程常驻内存,在连接数并不高的实例上把值调得很大纯属浪费,按实际建连速率给值。

易错点

  • 只看当前连接数不看正在运行的线程数:连着大量空闲连接并不代表压力,判断会跑偏
  • 报错连接数超限只加线程缓存不动最大连接数:缓存解决开销问题,解决不了容量问题
  • 压测后忘记把参数写回配置文件:重启回到旧值,优化效果消失
  • 把线程缓存当连接池用:服务端缓存的是线程,业务侧连接池才是控制并发与超时的地方

数据来源与参考

  • MySQL 8.0 Reference Manual: thread_cache_size

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌