![b278ab6a73ec1baeda461b4cd60ba44a.png](https://i-blog.csdnimg.cn/blog_migrate/728b37fef1324c87e915cd2c7cf4f78f.jpeg)
这里用单独的一篇介绍THD对象,目前看来THD对象是线程处理用户语句请求的核心类。然而该类实在是太大了,单单类的定义就差不多有了3500行。因此,这里不能够完全理解透,所以介绍得也不会全。望谅解~
1. 简单说明
THD没有查找到具体是什么的缩写,具体的代码定义是在mysql-server-8.0/sql/sql_class.h中,官方代码说明文档是在下面链接中。
https://dev.mysql.com/doc/dev/mysql-server/latest/classTHD.htmldev.mysql.com这个类给的官方说明是:
For each client connection we create a separate thread with THD serving as a thread/connection descriptor
暂且翻译为“线程描述类”(THread Descriptor)。
2. THD与类/结构的依赖图
该类与其他很多类都有直接或间接引用关系,具体的如下图所示(该图也不全,只是个人感觉比较重要的列出来了)。图中,空心三角箭头表示继承关系;实心四角箭头表示组合关系。
![68b96137ddb1e18b8598c04b5a4ab7c0.png](https://i-blog.csdnimg.cn/blog_migrate/7059c7a49681a20e5ceb17912c5f4477.jpeg)
3. THD依赖类/结构分类
为了方便介绍,将与THD相关类分成以下几个部分,分类是按照个人理解分的,不一定正确:
3.1 父类/接口类
THD类继承三个父类,分别是MDL_context_owner,Query_arena,Open_tables_state。
- MDL_context_owner:抽象类,主要与Metadata Lock 拥有者相关的接口,包括元数据边界控制(进入/退出),元数据信息通知等;
- Query_arena:维护语句的元素的类,这里的元素是指语句(含store procedure)解释成抽象语法树后的节点;
- Open_tables_state:维护该线程打开和封锁的表的状态,维护了(临时)表信息和锁信息,子类有Open_tables_backup
3.2 锁相关的
- MDL_context:元数据锁的上下文,维护了元数据的锁;
- THR_LOCK_INFO:线程锁的信息;
- User_level_lock:用户级别的锁信息;
- Global_read_lock:全局读锁;
- Locked_tables_list:该线程加锁的表列表;
3.3 接口语法语义相关
- Vio:与客户端交互的IO相关;
- LEX:语法解析后的parsed树,语法树;
- Parser_state:parser的内部状态机,包括输入参数,语法解析/语义解析过程中的使用的数据;
- Protocol:协议类(接口),包括传统协议(Protocal_classic),文本协议(Protocal_text),二进制协议(Protocal_binary);
- Query_plan:语句的执行计划;
- Prepared_statement_map:存储prepare语句的map,为<statement_id,Prepared_statement>的map;
3.4 日志/复制相关
- Binlog_user_var_event:binlog 的用户参数信息
- Gtid_set:该线程占用的Gtid的集合
- Gtid:Gtid信息
- Relay_log_info:重放日志的基本信息;
- Rpl_thd_context:Replication related context,与该THD对象复制相关的上下文
3.5 处理过程中上下文
- Resource_group_ctx:资源组的上下文,当前用到的资源组;资源组是指能够应用到线程的resource control的集合;
- Security_context:当前授权用户的所有THD对象集合(A set of THD members describing the current authenticated user);
- sp_rcontext: 当前store procedure的运行时的上下文,current runtime context
- System_variables:系统变量
3.6 事务相关
- Transaction_ctx:事务的上下文;
- Attachable_trx:只读的可附加事务,封装当前事务的状态,Class representing read-only attachable transaction, encapsulates knowledge how to backup state of current transaction
3.7 执行过程中的数据
- dd::cache::Dictionary_client:数据库对象的dictionary,主要包括了schema,table,tablespace,store program,字符集等定义。更多可以参考:https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-object-cache.html
- Ha_data:存储引擎级别的thread-local的数据
- sp_cache:stored routines的缓存,包括store procedure,store function.
- Item_change_record:记录语句优化时候对象树的转变过程;
- Discrete_intervals_list:记录当前insert语句的自增值间隔;
- sql_digest_state:Current/level statement digest
- partition_info:分区信息;
- Session_sysvar_resource_manager:会话系统变量的资源管理;
3.8 诊断优化相关
- Opt_trace_context: optimizer trace of current statement,当前语句的优化过程;
- Cost_model_server:Optimizer cost model for server operations,服务操作的优化代价模型;
- Secondary_engine_optimization:二级引擎是否用来优化语句;
- Session_tracker: 会话层的状态追踪;
- Internal_error_handler:内部错误处理器;
- Diagnostics_area:DA,诊断信息,包含多个不同的DA;
- PSI_thread: Performance schema thread instrumentation for this session,会话PSI;
- PSI_stage_progress:当前处理的PSI的状态,Current stage progress instrumentation;
- PSI_statement_info_v1:当前语句的PSI状态,Current statement instrumentation state
3.9 其他
- dd::DD_kill_immunizer:从kill操作中豁免器;为了防止DD进去到一个非一致的状态;
- Plugin_array:plugin数据信息,主要为audit相关的;
4. 总结
本文主要介绍了MySQL执行过程中的核心类,并将它的依赖类分成多个不同类别。如果在分类过程中存在问题,也望指出。
上篇:
Wenguang Liu:MySQL源码阅读2-连接与线程管理zhuanlan.zhihu.com![67dbe25bd64208641162fd0df42bc92c.png](https://i-blog.csdnimg.cn/blog_migrate/bfa1b03241974a0055b414da1aa5657b.jpeg)
下篇:
Wenguang Liu:MySQL源码阅读4-do_command函数/功能类命令zhuanlan.zhihu.com![67dbe25bd64208641162fd0df42bc92c.png](https://i-blog.csdnimg.cn/blog_migrate/bfa1b03241974a0055b414da1aa5657b.jpeg)