MySQL数据页的内部结构
mysql的数据页由7部分组成
File Header
文件头,38字节,用于描述页的信息
描述页的通用信息(页的编号,上一页是谁,下一页是谁)
包含
页的校验和
(checksum) 页号 上一页 下一页 页的类型 页属于哪个表空间常见的页的类型:Undo页,索引页(在innodb中,即数据页),系统页
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+树中所处的层级
- 页头,58字节,描述页的状态信息
- Infimum SupreMum
最大最小记录,26字节,这是两个虚拟的行记录 User Recoders
用户记录除了会记录我们自定义的字段的那些值
还会默认且必须的添加两个记录 事务id(trx_id) 和 回滚id(rollpoint_id)
- 用户记录,大小不确定,存储行记录的信息
- Free space
空闲记录,大小不确定,页中还没有使用的记录 Page Directory
页目录,大小不确定,存储用户记录的相对位置
我们使用二分法查找页目录中记录
将所有的记录分成几组,包括最小记录和最大记录,但不包括被标记为已删除的记录。
第一组只有一个记录,也就是最小记录,其余的每组中包含4~8个记录,最后一页包含1 到8条记录,这样做的好处是,除第一组的记录外,每组的记录都会平分。
每组最后一条记录的头信息会存储该组一共有多少条记录,n_owned字段
–
页目录用来存储每组最后一条记录的地址偏移量,会按照先后顺序存储起来
–每组的地址偏移量也被称之为槽,每个槽相当于指针指向了每个组最后一条记录
- File Trialer
文件尾,8字节,用于校验页是否完整