MySQL 中的 TABLE 是最核心的数据结构之一,包含的类包括:TABLE、TABLE_LIST、TABLE_SHARE 等,下面结合 MySQL 的代码进行分析说明。
基本说明
- TABLE_LIST:词法&语法分析后生成的对象,常见的生成方式为 add_table_to_list
- TABLE_SHARE:server 层表定义缓存,一个 table 实例对应一个 TABLES_SHARE 对象,可以将TABLE_SHRAE 对象看成是表的物理文件(frm)在内存中的映射
- TABLE:每一个查询 sql 中的表建一个 TABLE 对象
TABLE_LIST 只是一个表的描述信息,包括各种名称、锁类型等;
TABLE_SHARE 可以看作是完整的表定义信息,在 8.0 以前的版本中需要通过读取 frm 文件获取,8.0 版本中引入了 DD,可以直接通过 DD 获取到表定义信息。Server 层有一个全局的 Table_definition_cache 缓存对象,保存已经打开的 TABLE_SHARE 对象;
TABLE 对象为查询最后使用的 TABLE 信息,该对象上关联了引擎层的 hander,所有的引擎层的操作都需要通过此 hander 进行。Server 层同样有一个全局的 Table_cache_manager,然而 TABLE 的缓存和 TABLE_SHARE 的缓存不同,由于每个 THD 上的 TABLE 对象都不相同,所有同一个表会在 Table_cache_manager 保存多份。
关于 Table_cache_manager,有两个参数进行控制:
1 | MySQL [none]> show variables like "%table_open%"; |
其中:
- table_open_cache_instances 表示将 Table_cache_manager 分为多少个部分;
- table_open_cache 表示 TABLE 对象的阈值,超过此值后会开始进行无用对象的回收;
MySQL 8.0
1 | |--> open_tables |
MySQL 5.7
表打开过程
1 | bool open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx) |
表创建过程
1 | TABLE_LIST * |
1 | /* create table 过程 */ |
参考文献
http://mysql.taobao.org/monthly/2015/08/10/
http://liuyangming.tech/10-2019/information_schema-exploration.html