2、数据页内部组成
1、File Header(文件头部)(38字节)
FIL_PAGE_OFFSET(4字节):数据页唯一编号
FIL_PAGE_TYPE(2字节):页面类型,索引页、溢出页、系统页、Undo日志页等信息
FIL_PAGE_PREV(4字节)和FIL_PAGE_NEXT(4字节):页与页之间形成双向链表
FIL_PAGE_SPACE_OR_CHKSUM(4字节):校验数据完整性
FIL_PAGE_LSN(8字节):页面被最后修改对应的日志序列
2、Page Header(页面头部)
数据页中存储记录的状态信息。
3、Infimum + Supremum(最小最大记录)
记录主键最大值、最小值
4、Free Space (空闲空间)
插入用户记录之后剩余空间情况
5、Page Directory(页目录)
使用页目录,二分法查找,提升检索效率
6、Trailer(文件尾部)(8字节)
为了校验页的完整性
3、COMPACT行格式
变长字段长度列表:存放变长字段真实占用字节数,逆序存放
NULL值列表:null字段类型,到底存放值没有
记录头信息:
记录真实数据:除了自己定义的列,系统还会增加row_id唯一标识一条记录;transaction_id:事务id;roll_pointer:回滚指针
4、区、段、碎片区
为什么要有区的概念?一个去管辖64物理位置上连续的页,避免随机IO成本非常高。
为什么要有段?InnoDB对B+树的叶子节点和非叶子节点进行了区别对待,存放叶子节点的区的集合就算一个段,非叶子节点区的集合也算是一个段。常见的段有 数据段、 索引段、 回滚段。
为什么要有碎片区?
碎片区直属于表空间,并不属于任何一个段。碎片区中的页既可以属于A段也可以属于B段,有些甚至哪个都不属于。为了节约存储空间而设计。
5、表空间
表空间是一个 逻辑容器,表空间存储的对象是段,在一个表空间中可以有一个或多个段,但是一个段只能属于一个表空间。表空间数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间(Systemtablespace)、独立表空间(File-per-table tablespace)、撤销表空间(Undo Tablgspace)和 临时表空间(Temporary Tablespace)等。
5.1 独立表空间
独立表空间结构
独立表空间由段、区、页组成。