innodb数据页的空间被分成了7部分
记录头:
delete_mask表示当前记录是否被删除,被删掉的记录不会立马清除,next_record会把被删掉的记录组成一个垃圾链表,以备重用这部分数据
min_rec_mask b+树每层非叶子节点的最小记录都会添加该标记
n_owned 记录分组中有多少条记录
heap_no 表示当前记录在本页中的位置 mysql默认会添加两条伪记录,一个代表最大记录一个代表最小记录
record_type 0普通记录 1 b+树非叶子节点记录 2最小记录 3最大记录
next_record 当前记录的真实数据到下条记录的真实数据的地址偏移量 最小记录是第一个 最大记录是最后一个,注意nextRecoed在真实数据与记录头信息之间
页目录page directory
1. 将未删除的记录分组
2. 每组的最后一条记录的n_owned记录本组记录数
3. 每组最后一条记录的偏移量存入page directory
规定: 最小记录所在组只能有7条记录 最大记录所在组至多7条,剩下的分组至多8条记录
示例:
1. 初始情况下只有最大记录与最小记录 两个组
2. 插入数据从page directory中查找大于插入主键 并且与插入主键差值最小的组 放入记录,并把该槽位的n_owned+1
3. 当组中n_owned等于8,再插入时 把9条数据分成两个组,page directory中新增一个槽存储 新增组最大主键的偏移值
页面头部page header
page header记录这页的状态信息 记录有多少记录有多少槽等
1. PAGE_N_DIR_SLOTS 页目录中槽
2. PAGE_HEAP_TOP 还未使用的空间最小地址该地址之后就是free space
3. PAGE_N_HEAP 本页中记录的数量 (最大最小记录+被删除的记录+正常记录)
4. PAGE_FREE 第一个已经标记为删除的记录的地址
5. PAGE_GARBAGE 已删除记录占用的字节数
6. PAGE_LAST_INSERT 最后插入记录的位置
7. PAGE_DIRECTION 记录插入方向 新增主键大于之前的主键page direction 向右
文件头部 file header
1. FIL_PAGE_SPACE_OR_CHKSUM 页的校验和 对于较长的值通过某种算法计算出较短的值 这个比较短的值就是校验和
2. FIL_PAGE_OFFSET 页号
前4个字节代表也的校验和