🔗 MySQL 连接资源 — 内部数据结构全景

每一条连接背后,MySQL 都会实例化一个 THD 对象并分配一批核心资源

客户端连接
连接 #1001
root @ 127.0.0.1:52310
Running
db: shop
连接 #1002
app @ 10.0.0.5:48201
Sleep
db: user_db
连接 #1003
replica @ 10.0.0.9
Connect
Binlog Dump
最多 max_connections 条
每条连接 = 一个独立的
OS 线程(默认)或
线程池中的一个 worker
THD(Thread Descriptor)
MySQL 连接的核心数据结构 · C++ 对象 · ~8KB 基础大小
🪪 身份 & 认证
thread_iduint64
全局唯一连接ID(SHOW PROCESSLIST)
m_userLEX_CSTRING
登录用户名
m_hostLEX_CSTRING
来源 host/IP
m_dbLEX_CSTRING
当前数据库名
m_security_ctxSecurity_context*
权限上下文(ACL)
🌐 网络通信层
m_netNET
网络 I/O 结构体(见右侧展开)
m_protocolProtocol*
MySQL 协议处理器(文本/二进制)
packetString
当前收发数据包缓冲区
m_sslSSL*
TLS 上下文(可选)
read_buf (net_buffer_length)
默认 16KB 读缓冲
write_buf (max_allowed_packet)
默认 64MB 写缓冲上限
⚙️ 查询执行上下文
lexLEX*
SQL 解析树(词法/语法解析结果)
queryString
当前 SQL 语句文本
m_query_planQuery_plan
查询计划(EXPLAIN 数据)
joinJOIN*
当前 JOIN 执行链
m_statementStatement*
Prepared Statement 缓存
🔒 事务 & 锁
transactionTHD_TRANS
事务状态机(BEGIN/COMMIT/ROLLBACK)
mdl_contextMDL_context
元数据锁(DDL 冲突检测)
lockMYSQL_LOCK*
表锁链表
open_tablesTABLE*
已打开表的链表
in_active_multi_stmt_transbool
是否在显式事务中
🗑️ 内存分配器
mem_rootMEM_ROOT
Arena 分配器(语句级生命周期)
transaction.mem_rootMEM_ROOT
事务级 Arena(COMMIT 时释放)
▸ 块大小: 8KB(默认)
▸ 不逐个 free,整块释放
▸ 比 malloc 快 ~3x
📊 状态 & 统计
m_commandenum_server_command
当前命令类型(Query/Ping/Quit)
status_varSystem_status_var
连接级计数器(查询数/错误数等)
m_start_timetimeval
语句开始时间(超时判断)
killedatomic<int>
KILL 信号标志
m_digestsql_digest_state
SQL Digest(performance_schema)
💡 THD 对象由 new_thd() 创建,绑定到一个 OS 线程;连接断开时由 close_connection() 析构并归还线程栈内存
🌐 NET 结构体(展开)
read_pos 读指针
read_end 读缓冲末
buff 读缓冲区 (16KB)
write_pos 写指针
write_end 写缓冲末
max_packet 最大包大小
vio Vio* 虚拟I/O
compress 压缩标志
error 网络错误码
📦 Sort / Temp Buffer
sort_buffer ORDER BY 排序缓冲
默认 256KB,可扩展到
sort_buffer_size 上限
join_buffer JOIN 哈希缓冲
join_buffer_size 默认 256KB
read_rnd_buffer 随机读缓冲
⚠️ 每连接独占,高并发时是内存大户
🗄️ 线程栈 (thread_stack)
默认 1MB(64位)
存放调用栈帧
递归 SP 解析栈
⚠️ 连接数 × 1MB = 系统内存
📈 Performance Schema
events_waits 等待事件环形队列
events_statements 语句历史
memory_summary 内存跟踪
可通过 setup_consumers 按需开关
📐 单条连接的内存开销分布(典型值,空闲连接)
THD
对象
~8KB
NET
读缓冲
16KB
mem_root
Arena
8KB+
线程栈 (thread_stack = 1MB)
Performance
Schema
~50KB
Sort/Join
Buffer
按需分配
THD 对象 ~8KB
NET 读缓冲 16KB
mem_root Arena 8KB+
线程栈 1MB(最大头)
Performance Schema ~50KB
Sort/Join Buffer(查询时按需申请)
空闲连接(Sleep)最小开销
≈ 1.1 MB
主要是线程栈(1MB)+ 基础结构
活跃查询时(开 PFS + 排序)
≈ 1.8 MB+
+sort_buffer_size(256KB) + join_buffer + PFS
100 连接 × 空闲开销
≈ 110 MB
连接数是内存规划的核心变量
与线程池模式对比
省 ~60%
Thread Pool 可复用线程栈,大幅降低内存
🔄 连接生命周期
1. TCP accept → 创建 socket fd
2. 新建线程 → 分配 thread_stack
3. new THD() → 分配 THD 对象 & NET buf
4. 握手认证 → 填充 Security_context
5. dispatch_command() → 循环处理 SQL
6. close_connection() → 析构 THD
7. 线程退出 → 释放 thread_stack(或归池)
⚡ 关键配置参数
max_connections = 151(默认)
thread_stack = 1048576(1MB)
net_buffer_length = 16384(16KB)
max_allowed_packet = 67108864(64MB)
sort_buffer_size = 262144(256KB)
join_buffer_size = 262144(256KB)
performance_schema = ON
🔑 核心数据结构关系
THD 包含 → NET(I/O)
THD 包含 → LEX(SQL 解析树)
THD 包含 → MDL_context(元数据锁)
THD 包含 → MEM_ROOT(内存池)
THD 指向 → Security_context(ACL)
THD 指向 → InnoDB trx_t(事务对象)
THD 链接 → TABLE*(已打开表链表)
基于 MySQL 8.0 源码(sql/sql_class.h · sql/net_ns.h)· 数值为默认配置参考值