千家信息网

InnoDB数据字典--字典表加载

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,1、介绍 在InnoDB启动时,如果是新建数据库则需初始化库,需要创建字典管理的相关信息。函数innobase_start_or_create_for_mysql调用dict_create完成此
千家信息网最后更新 2026年11月01日InnoDB数据字典--字典表加载

1、介绍

    在InnoDB启动时,如果是新建数据库则需初始化库,需要创建字典管理的相关信息。函数innobase_start_or_create_for_mysql调用dict_create完成此功能。即创建数据字典,因为InnoDB系统表的个数结构固定,所以初始化库的时候只需要创建这几个表的B+树即可并将B+树的根页号存放到固定位置。对于B+树,只要找到根页面,就可以从根页面开始检索数据。相关系统表(即上一节讲到的4个系统表)在InnoDB内部,不会暴露给用户。    4个系统表通过固定的硬编码进行构建。具体原理流程如下。

2、数据字典创建及加载原理流程

3、说明

1)innobase_start_or_create_for_mysql函数调用dict_create()函数进行数据字典的创建和加载工作。

2)dict_hdr_create完成系统表空间第7号页面dict header的初始化及创建SYS_TABLES两个索引、SYS_COLUMNS一个索引、SYS_INDEXES一个索引、SYS_FIELDS一个索引,其创建索引的函数是btr_create。

3)创建B+树索引后,通过dict_boot函数加载常驻内存的4个系统表。具体流程见流程图的②部分。

4)加载完成后,将这4个系统表挂在一个全局字典中:

dict0dict.h::

/* Dictionary system struct */  struct dict_sys_t{      ib_mutex_t      mutex;      /*!< mutex protecting the data                     dictionary; protects also the                     disk-based dictionary system tables;                     this mutex serializes CREATE TABLE                     and DROP TABLE, as well as reading                     the dictionary data for a table from                     system tables */      row_id_t    row_id;     /*!< the next row id to assign;                     NOTE that at a checkpoint this                     must be written to the dict system                     header and flushed to a file; in                     recovery this must be derived from                     the log records */      hash_table_t*   table_hash; /*!< hash table of the tables, based                     on name */      hash_table_t*   table_id_hash;  /*!< hash table of the tables, based                     on id */      ulint       size;       /*!< varying space in bytes occupied                     by the data dictionary table and                     index objects */      dict_table_t*   sys_tables; /*!< SYS_TABLES table */      dict_table_t*   sys_columns;    /*!< SYS_COLUMNS table */      dict_table_t*   sys_indexes;    /*!< SYS_INDEXES table */      dict_table_t*   sys_fields; /*!< SYS_FIELDS table */      /*=============================*/      UT_LIST_BASE_NODE_T(dict_table_t)              table_LRU;  /*!< List of tables that can be evicted                     from the cache */      UT_LIST_BASE_NODE_T(dict_table_t)              table_non_LRU;  /*!< List of tables that can't be                     evicted from the cache */  }; 

结构体中sys_tables、sys_columns、sys_indexes、sys_fields四个结构存储上述对应的4个系统表。

结构体中HASH表及链表用来存储InnoDB中的所有表的缓存,包括系统表及用户表。table_hash哈希表按名字缓存,table_id_hash按表ID进行hash,LRU链表用来管理表对象缓存。

5)普通用户表加载流程见流程图的③、④部分。

当用户访问一个用户表时,首先需要从表对象缓存中查找这个表的SHARE对象,如果找到则直接从其实例化表对象链表中拿一个使用;如果没有找到,则需要重新打开这个表,需要找到这个表的字典信息。即③的流程。

具体加载一个表的字典是④流程,dict_load_table的工作。

a)首先需要找到SYS_TABLES表,也是先找缓存,缓存找不到再从系统表加载: dict_table_get_low

b)找到之后构建一个查询键值,从SYS_TABLES的name主键索引进行查询,如果诶呦找到或者该记录已经被删除则返回,否则解析找到的这条记录。然后根据这些信息创建表的内存对象table。

c)加载列操作与加载表的原理基本一样,对应系统表的SYS_COLUMNS,聚集索引为(TABLE_ID,POS),查找时,如果TABLE_ID相同,在POS从小到大排序,所以构造所有列的键值时,只需要通过TABLE_ID查询即可,按顺序取出所有列信息一一构造内存对象。

d)加载索引信息类似的流程

系统 流程 索引 字典 对象 缓存 数据 信息 函数 用户 结构 内存 原理 页面 用户表 查询 流程图 部分 存储 工作 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 鸠鸠互联网科技 互联网科技有限公司图片 港股互联网科技股 易互联网科技有限公司 深圳互联网络科技有限公司 互联网科技小贷 互联网科技咨询 互联网巨头投资的硬核科技 云创客互联网科技公司 团飞科技与伯堂互联网服务平台 湖南诚度互联网科技有限公司 厦门千工互联网科技有限公司 996高科技互联网公司 华夏恒生互联网科技013171 互联网科技的全部知识 为客找房互联网科技公司怎么样 互联网科技圈年度人物 中国互联网有什么科技 梅州GM互联网络科技有限公司 宁波允成互联网科技有限公司 互联网科技官网 智能科技公司是互联网公司吗 互联网公司 科技公司 奇酷互联网络科技 时间互联网络科技 想开互联网科技公司怎么样 互联网风格科技公司名称 广州三三互联网科技有限公司 保山浩联互联网科技有限公司 银川新华互联网科技学校招聘
0