实际文件
数据目录下 有个 ibdata1
就是系统表空间
看数据目录SHOW VARIABLES LIKE 'datadir';
每个文件夹对应一个数据库, 选中的是系统数据库,文件夹名就是数据库名, 里面有几个 文件表名.ibd
是独立表空间实际放数据的文件
系统数据库
系统数据库有4个,除了图中选中的三个外 还有information_schema
这个系统数据库
系统表空间 的数据结构
系统表空间 Space ID 是0
是记录整个系统的元数据的
和普通的表空间 , 在结构上的差异就是 表空间的 第一组的 3~7 号页(0 1 2 页和独立表空间类型也是一样的)
information_schema
如上文所述, 4个系统数据库里面 只有information_schema 没有对应的文件夹
因为它就没自己的数据
在存储引擎启动的时候,会读取 真的系统内部表(SYS
开头的表), 填充到information_schema
系统数据库里面的INNODB_SYS
开头的表里面
内部系统表(也叫数据字典)
数据库除了我们自己插入的信息外, 还需要保存许多额外的数据才能运行
比如 有哪些库, 表,列,每个表的索引,外键, 表空间对应哪个文件路径
这些数据称为元数据
记在 内部系统表 (也叫数据字典)里面,
有很多内部系统表, 以下4个最重要
SYS_TABLES
整个InnoDB存储引擎中所有的表
的信息
SYS_COLUMNS
整个InnoDB存储引擎中所有的列
的信息
SYS_INDEXES
整个InnoDB存储引擎中所有的索引
的信息
SYS_FIELDS
整个InnoDB存储引擎中所有的索引对应的列
的信息
这些内部系统表的元数据 直接硬编码在代码里面
这4个表的 索引的根节点
记在 系统表空间的 7号页面(就是第八页)上
这页的类型是 SYS , 我们给它取名叫
data directory header 页
data directory header 页
data directory header
Max Row ID:不论哪个拥有row_id列的表插入一条记录时,该记录的row_id列的值就是Max Row ID对应的值,然后再把Max Row ID对应的值加1,也就是说这个Max Row ID是全局共享的。
Max Table ID:用于记录表号 最大到哪了
Max Index ID:用于记录索引号 最大到哪了
Max Space ID:用于记录表空间号 最大到哪了
4个基本表对应的
根节点
页
Segment Header
和每个根节点页的page header里面的2个
Segment Header
是一样的, 都是用于找到段对应的INODE Entry
的INODE Entry
主要记载了 段对应的3条链表在哪, 段对应的零散页是哪几个