笔记大纲
1.数据页的结构总览
2.记录在页中的存储和排列
用户的数据记录存放在User Records的部分,一个页生成的时候是没有User Records的,当有记录需要插入进来的时候通过去Free Space申请空间,如果足够的话那么就会开辟User Records空间作为记录空间。如果Free Space的空间不够了,就会申请新的页。
用户数据的记录在User Records中是密集无缝隙的排列,且按照主键的大小从小到大单向链表排列。
3.Infimum记录和Supremum记录
InnoDB在设计时,在为每个页都分配了2个内置的记录,这个记录并不是用户真实记录。
Infimum记录
表示一个页中最小的记录。
Supremum记录
表示一个页中最大的记录。
也就是说在一个页里,没有任何一个真实记录小于Infimum,没有一个真实记录大于Supremum。
4.记录的行格式
4.1 delete_flag 删除标志位
这个记录属性在记录头中代表该记录是否被删除,占用1个bit位。InnoDB删除数据并不是立即从磁盘上抹掉,而是设置标志位然后将记录放入垃圾链表
,这个被标记了删除的记录此时仍然占据着空间,后续如果有新的记录插入,且主键大小在这里,那么就会覆盖。
4.2 next_record 下一个记录相对指针(重要)
next_record表示当前记录的真实数据位置到下一条记录真实数据位置的相对偏移量
,注意不是记录的相对位置,而是记录里面真实数据的相对位置。
由于记录的可变长、null值列表等信息是逆序存放,查找的时候有更高的高速缓存命中率。
5.记录的存放方式
记录在user_records空间中通过单向链表来串联存放。
6.Page Directory 页目录
因为记录是链表形式存放,如果遍历的时候最坏的情况时间复杂度是O(n),为了提高检索的效率,InnoDB采用了目录 + 二分法来提高数据查询效率。页目录就是一个单独提取出来的记录目录。
槽
:InnoDB将数据记录按4~8个为一组,提取出最大记录的偏移量存放到页目录中,加快检索速度,通过二分查找法快速定位。
7.Page Header 页头
记录页的元数据信息,例如页的记录数、页目录有多少个槽、页的类型、页在B+Tree的层级等信息。
8.File Header 文件头
记录当前页的上一个页、下一个页的页号、页属于哪个表空间、页号等信息。
页号
:唯一标识一个页的ID,不重复。
页的排列
:通过文件头的指针,双向链表关联。
9.File Trailer 文件尾
用来校验数据页的完整性,固定8字节长度。数据页刷回磁盘时,为了保证页的完整性。
文件头和文件尾都存放着校验信息,因为文件头先刷入磁盘,这样可以校验文件头和文件尾的校验和是否一致来判断页是否完整。