mysql-innodb-页结构-索引页

 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 向右

  8. PAGE_N_DIRECTION 一个方向连续插入的记录数量
  9. PAGE_N_RECS 页中记录的数量(不包含被删除记录和最大最小记录)
  10. PAGE_MAX_TRX_ID
  11. PAGE_LEVEL 当前页在b+树中所处的层级
  12. PAGE_INDEX_ID 索引id 表示当前页属于哪个索引
  13. PAGE_BTR_SEG_LEAF
  14. PAGE_BTR_SEG_TOP 

 文件头部 file header

  1. FIL_PAGE_SPACE_OR_CHKSUM   页的校验和 对于较长的值通过某种算法计算出较短的值 这个比较短的值就是校验和

  2. FIL_PAGE_OFFSET  页号 

  3. FIL_PAGE_PREV 上一个页页号 与filepagenext组成双向链表 并不是所有类型的页都有这两个数据
  4. FIL_PAGE_NEXT  下一个页页号
  5. FIL_PAGE_LSN  日志被最后修改时对应的⽇志序列位置
  6. FIL_PAGE_TYPE 页类型
  7. FIL_PAGE_FILE_FLUSH_LSN
  8. FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID 页属于哪个表空间
 file trailer
  
  记录页的校验和与file header中的校验和一致,修改之后,当从内存同步数据到磁盘的过程中file header中的校验和是最新计算的,同步时出现问题 因为fileheader会先同步到磁盘中,还未同步file trailer的校验和 这时两个校验和不一致 意味着数据同步出错
  前4个字节代表也的校验和
  后4个字节被修改时对应的日志序列位置
原文地址:https://www.cnblogs.com/isnotnull/p/14331778.html