前面说了xdes 类型页面,第一页的extent0里面的xdes页面叫做fsp 因为里面还存着表空间的数据file space header,这里面主要存着xdes entry几个链表的基点,和inode entry链表的基点,后面的每个组第一页都是xdes类型页面。
Extent0里面还有inode类型页面,这里面主要存着seg_inode_free和seg_inode_full两个链表存储着inode entry,他们的基点也在file space header。
Segment header因为每个索引都有两个段,这个记录着每个段的区别,属于哪个段。
原创 Xdes&Inode&Seg Header(6) 独立表空间结构(三十二)
系统表空间整体结构
了解独立表空间后,现在来看系统表空间,因为mysql进程整体只有一个系统表空间,来额外记录整个系统的信息,所以系统表空间你比较猛,相当于表空间之首,他的space id表空间id为0。
Extent0:
FSP HDR:16个 字节。
IBUF_BITMAP:16个字节。
INODE:16个字节。
Sys insert buffer header:16个字节。
Index inset buffer boot:16个字节。
Trx_sys:16个字节。
Sys first rollback segment:16个字节。
Sys data directory header:16个字节。
Extent1和extent2:
Xdes:16个字节。
Ibuf_bitmap:16个字节。
由上可以看到,系统表空间和独立表空间有很多相同之处,在第一个页多了5个参数,其他的FSP hdr里面有file space header 里面存着表空间的直属信息,比如链表的基点等,还有与xdes 一样的信息,xdes里面存着管理区的各种链表,free,free_frag,full_frag,fseg。
Inode类型存着段的一些信息,段的头部和尾部信息,之前file page也有这种尾部信息,效验文件是否完整。还有三个链表,free,not_full,full(所以到目前为止,我们知道有两个地方需要效验文件是否完整,一个是file header,一个是inode类型的页面)
接下来我们重点看多出来的五个部分。
- insert buffer header: sys类型,存储insert buffer 的头部信息。
- insert buffer root index类型,存储insert buffer的根页面。
- transaction system:trx_sts类型,事务系统的相关信息。
- First rollback segment:sys类型,第一个回滚页面。
- Data dictionary header:sys类型,数据字典头部信息。
除了记录系统属性页面外,系统表空间的extent1和extent2这两个区,我们之前说过一个区有64个页面,所以这128个页面在64~191的页面称为Doublewrite buffer,也就是双写缓冲区,这里面知识涉及到事务和多版本控制,后面的文章会 详细介绍。
InnoDB数据字典
我们平时用insert语句插入的数据称为真实数据,或者用户数据。当我们向表里插一条数据的时候,mysql会先效验表存不存在,存入的格式是否正确,如果语法没有问题的话,还需要知道该表的聚簇索引和二级索引在哪个根页面和表空间系统的哪个页面,然后把数据插入对应的b+树节点中。所以说,mysql除了存储插入的用户数据外,还有许多额外数据需要存储。
- 表属于哪个表空间,表里面多少列。
- 表对应每个列的类型。
- 该表有多少索引,每个索引对应哪几个字段,该索引对应的根页面在哪个表空间的哪个页面。
- 该表多少外键,外键对应哪些表哪些列。
- 某个表空间对应文件系统上的文件路径是什么。
- 。。。等等
上面这些数据都不是我们insert插入的数据,实际是为了mysql更好管理用户数据的数据,我们称这些数据为元数据,mysql特定用内部系统表(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存储引擎中所有虚拟生成列信息。
这些系统表称为数据字典,他们以b+树的形式存在表空间的某些页面,其中sys_table,sys_columns,sys_indexes,sys_fields四个称为基本系统表(basic system tables)。
sys_table
- name:表名称。
- id:每个表的唯一id。
- n_cols:该表拥有列的个数。
- type:表的类型,记录了一些文件格式,行格式,压缩等。
- mix_id:已过时,忽略。
- mix_len:表的一些额外属性。
- cluster_id:未使用。
- space:该表所属的对应表空间。
Sys_table有两个索引,以name列为主键的聚簇索引,以id列建立的二级索引。
sys_columns表
- table_id:该列所属表对应的id。
- pos:该列在表中第几列。
- name:该列的名称。
- mtype:全称main data type,主数据类型,就是int,char,varchar,double等之类的。
- prtype:precise type,精确数据类型,修饰主类数据的数据,比如是否允许为null,是否有默认值。
- LEN:该列最多占用的存储空间字节数。
- PREC:该列的精度,默认都是0。
这个sys_columns表只有一个联合索引(table_id,pos)为主键的聚簇索引。
Sys_indexes表
- table_id:该索引对应的表id。
- id:每个索引都有一个唯一的id。
- name:索引的名称。
- n_fields:该索引包含列的个数。
- type:该索引的类型,比如聚簇索引,唯一索引,更改缓冲区索引,全文索引,普通的二级索引等各种类型。
- space:该索引根页面所在的表空间id。
- page_no:该索引根页面所在的页面号。
- merge_threshold:如果页面记录被删除到某个比例,就把该页面和相邻页面合并,该字段就是某个比例
Sys_fields表
- index_id:索引列所属的id。
- pos:该索引列在某索引第几列。
- col_name:该索引列的名称。
Sys_fields表只有一个聚集索引,以(index_id,pos)为主键的聚簇索引。