系统表空间 id 是0.

系统表空间的整体结构

image.png

页号 页面类型 英文描述 描述
3 SYS Insert Buffer Header 存储Insert Buffer的头部信息
4 INDEX Insert Buffer Root 存储Insert Buffer的根页面
5 TRX_SYS Transction System 事务系统的相关信息
6 SYS First Rollback Segment 第一个回滚段的页面
7 SYS Data Dictionary Header 数据字典头部信息

InnoDB 数据字典

一些列的内部系统表(internal system table)(数据字典):

表名 描述
SYS_TABLES 整个InnoDB存储引擎中所有的表的信息
SYS_COLUMNS 整个InnoDB存储引擎中所有的列的信息
SYS_INDEXES 整个InnoDB存储引擎中所有的索引的信息
SYS_FIELDS 整个InnoDB存储引擎中所有的索引对应的列的信息
SYS_FOREIGN 整个InnoDB存储引擎中所有的外键的信息
SYS_FOREIGN_COLS 整个InnoDB存储引擎中所有的外键对应列的信息
SYS_TABLESPACES 整个InnoDB存储引擎中所有的表空间信息
SYS_DATAFILES 整个InnoDB存储引擎中所有的表空间对应文件系统的文件路径信息
SYS_VIRTUAL 整个InnoDB存储引擎中所有的虚拟生成列的信息

其中SYS_TABLES、SYS_COLUMNS、SYS_INDEXES、SYS_FIELDS这四个表尤其重要,称之为基本系统表(basic system tables)

SYS_TABLES表

列名 描述
NAME 表的名称
ID InnoDB存储引擎中每个表都有一个唯一的ID
N_COLS 该表拥有列的个数
TYPE 表的类型,记录了一些文件格式、行格式、压缩等信息
MIX_ID 已过时,忽略
MIX_LEN 表的一些额外的属性
CLUSTER_ID 未使用,忽略
SPACE 该表所属表空间的ID

  • 以NAME列为主键的聚簇索引
  • 以ID列建立的二级索引

SYS_COLUMNS表

列名 描述
TABLE_ID 该列所属表对应的ID
POS 该列在表中是第几列
NAME 该列的名称
MTYPE main data type,主数据类型,就是那堆INT、CHAR、VARCHAR、FLOAT、DOUBLE之类的东东
PRTYPE precise type,精确数据类型,就是修饰主数据类型的那堆东东,比如是否允许NULL值,是否允许负数啥的
LEN 该列最多占用存储空间的字节数
PREC 该列的精度,不过这列貌似都没有使用,默认值都是0

  • 以(TABLE_ID, POS)列为主键的聚簇索引

SYS_INDEXES表

列名 描述
TABLE_ID 该索引所属表对应的ID
ID InnoDB存储引擎中每个索引都有一个唯一的ID
NAME 该索引的名称
N_FIELDS 该索引包含列的个数
TYPE 该索引的类型,比如聚簇索引、唯一索引、更改缓冲区的索引、全文索引、普通的二级索引等等各种类型
SPACE 该索引根页面所在的表空间ID
PAGE_NO 该索引根页面所在的页面号
MERGE_THRESHOLD 如果页面中的记录被删除到某个比例,就把该页面和相邻页面合并,这个值就是这个比例

  • 以(TABLE_ID, ID)列为主键的聚簇索引

SYS_FIELDS表

列名 描述
INDEX_ID 该索引列所属的索引的ID
POS 该索引列在某个索引中是第几列
COL_NAME 该索引列的名称

  • 以(INDEX_ID, POS)列为主键的聚簇索引

Data Dictionary Header页面

这4个表是表中之表,那这4个表的元数据去哪里获取呢?没法搞了,只能把这4个表的元数据,就是它们有哪些列、哪些索引等信息硬编码到代码中,然后设计InnoDB的大叔又拿出一个固定的页面来记录这4个表的聚簇索引和二级索引对应的B+树位置,这个页面就是页号为7的页面,类型为SYS,记录了Data Dictionary Header,也就是数据字典的头部信息。除了这4个表的5个索引的根页面信息外,这个页号为7的页面还记录了整个InnoDB存储引擎的一些全局属性

image.png

名称 中文名 占用空间大小 简单描述
File Header 文件头部 38字节 页的一些通用信息
Data Dictionary Header 数据字典头部信息 56字节 记录一些基本系统表的根页面位置以及InnoDB存储引擎的一些全局信息
Segment Header 段头部信息 10字节 记录本页面所在段对应的INODE Entry位置信息
Empty Space 尚未使用空间 16272字节 用于页结构的填充,没啥实际意义
File Trailer 文件尾部 8字节 校验页是否完整

information_schema系统数据库

  1. mysql> USE information_schema;
  2. Database changed
  3. mysql> SHOW TABLES LIKE 'innodb_sys%';
  4. +--------------------------------------------+
  5. | Tables_in_information_schema (innodb_sys%) |
  6. +--------------------------------------------+
  7. | INNODB_SYS_DATAFILES |
  8. | INNODB_SYS_VIRTUAL |
  9. | INNODB_SYS_INDEXES |
  10. | INNODB_SYS_TABLES |
  11. | INNODB_SYS_FIELDS |
  12. | INNODB_SYS_TABLESPACES |
  13. | INNODB_SYS_FOREIGN_COLS |
  14. | INNODB_SYS_COLUMNS |
  15. | INNODB_SYS_FOREIGN |
  16. | INNODB_SYS_TABLESTATS |
  17. +--------------------------------------------+
  18. 10 rows in set (0.00 sec)

image.png