MySQL数据页的内部结构

mysql的数据页由7部分组成

  1. File Header文件头,38字节,用于描述页的信息

描述页的通用信息(页的编号,上一页是谁,下一页是谁)

包含页的校验和(checksum) 页号 上一页 下一页 页的类型 页属于哪个表空间

常见的页的类型:Undo页,索引页(在innodb中,即数据页),系统页

  1. Page Header

页面头部,记录本页已经存储了多少条记录,第一条记录的地址是什么,本页一共有多少个槽等,专门存储各种状态信息

Page_index_id 当前页属于哪个索引

page_Heap_Top 还未使用的空间最小地址,从该地址往后都是free Space

Page_N_Heap 本页记录数量,包括最小最大记录,被标记为已删除的记录

Page_free 第一个被标记为已删除的记录地址,(各个被删除的记录通过next_record 会组成一个单链表,里面的记录也可以被重复利用)

page_garbage 被标记为删除的记录占用的字节数

page_last_insert 最后插入记录的位置

page_n_recs (该页中记录的数量,不包括最小最大记录,被标记为已删除的记录)

page_max_trx_id 修改该页最大的事务id,仅在二级索引中定义

page_level 当前页在B+树中所处的层级

  1. 页头,58字节,描述页的状态信息
  2. Infimum SupreMum
    最大最小记录,26字节,这是两个虚拟的行记录
  3. User Recoders

用户记录除了会记录我们自定义的字段的那些值

还会默认且必须的添加两个记录 事务id(trx_id) 和 回滚id(rollpoint_id)

  1. 用户记录,大小不确定,存储行记录的信息
  2. Free space
    空闲记录,大小不确定,页中还没有使用的记录
  3. Page Directory页目录,大小不确定,存储用户记录的相对位置

我们使用二分法查找页目录中记录

将所有的记录分成几组,包括最小记录和最大记录,但不包括被标记为已删除的记录。

第一组只有一个记录,也就是最小记录,其余的每组中包含4~8个记录,最后一页包含1 到8条记录,这样做的好处是,除第一组的记录外,每组的记录都会平分。

每组最后一条记录的头信息会存储该组一共有多少条记录,n_owned字段

页目录用来存储每组最后一条记录的地址偏移量,会按照先后顺序存储起来–每组的地址偏移量也被称之为槽,每个槽相当于指针指向了每个组最后一条记录

  1. File Trialer
    文件尾,8字节,用于校验页是否完整