在了解了独立表格空间的基本结构後,系统表格空间就好了解多了,基本上很类似,但系统表格空间需要纪录一些与整个系统相关的资讯,所以多一些用来记录这些资讯耊面,因为其是最重要的,相当於所有表格空间的带头大哥,所以他的SpaceID是0。
我们知道独立表格空间第一组的前三页固定是[FSP_HDR(页号0)、IBUF_BITMAP(页号1)、INODE(页号2)]
而系统表格空间又多了以下五个页面
- SYS(insert buffer header):储存change buffer的表头资讯
- INDEX(insert buffer root):储存change buffer的根页面
- TRX_SYS(transaction system):交易系统的相关资讯
- SYS(fisrt rollback segment):第一个回覆段的资讯
- SYS(data dictionary header):资料字典表头资讯
Innodn资料字典
要实现一个插入纪录的动作,Mysql除了保存我们要插入的使用者纪录外,还需要其他额外的资讯。比如:
- 表属於那个表格空间,表内有多少列?
- 表对应的每一列类型是什麽?
- 表有多少索引?每个索引对应那些栏位?该索引的根页面在那个表格空间的那个页面?
- 表有那些外键?外键对应表的那些列?
- 某个表格空间对应的档案系统上的档案路径是什麽?
这些为了更进一步管理使用者纪录而不得不引入的一些额外机料,又称为中继资料。
Innodb储存引擎特意定义了一系列的内部系统表来纪录这些中继资料。
- 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储存引擎中所有虚拟生成列的资讯
这些系统表也被称为资料字典,它们都是以B+树的形式保存在系统表格空间的某些页面。
来看看几个较重要的表的详细资讯
- SYS_TABLES表
- NAME:表的名称
- ID:表的唯一ID
- N_COLS:该表拥有列的个数
- TYPE:表的类型,纪录了些档案格式、行格式、压缩等资讯
- MIX_ID:已过时,忽略
- MIX_LEN:表的额外属性
- CLUSTER_ID:未使用,忽略
- SPACE:表所属表格空间的ID
该表有两个索引
(1)以NAME列为主键的聚簇索引
(2)以ID列建立的二级索引
- SYS_COLUMNS表的列
- TABLE_ID:所属表的ID
- POS:该列在表中是第几列
- NAME:该列的名称
- MTYPE:主资料类型(ex:int, char, varchar之类的)
- PRTYPE:精确资料类型,修饰主资料的那些东西(ex:是否允许NULL之类的)
- LEN:该列最多占用储存空间的位元组数
- PREC:该列的精度(似乎没有使用),预设值都是0
该表只有一个索引 - 以(TABLE_ID,POS)列为主键的聚簇索引
- SYS_INDEXES表的列
- TABLE_ID:该索引所属表对应的ID
- ID:索引的唯一ID
- NAME:索引的名称
- N_FIELDS:索引包含列的个数
- TYPE:索引类型(ex:聚簇索引, 唯一二级索引, 全文索引之类的)
- SPACE:索引根页面所在的表格空间ID
- PAGE_NO:索引根页面所在的页面号
- MERGE_THRESHOLD:如果页面中的纪录被删除到某个比例,就尝试把该页和相邻页合并,这个值就是这个比例
该表只有一个索引 - 以(TABLE_ID,ID)列为主键的聚簇索引
- SYS_FIELDS表的列
- INDEX_ID:该列所属索引的ID
- POS:该列在索引列中是第几列
- COL_NAME:该列的名称
该表只有一个索引 - 以(INDEX_ID,POS)列为主键的聚簇索引
除了这四个重要的表外,系统表格空间的第7个页面纪录了资料字典的表头资讯(未来有需要在进一步说明)