InnoDB 数据页结构

2019-09-29  本文已影响0人  wpf_register

原文链接 - InnoDB数据页结构

页是MySQL管理存储空间的基本单位,一个页的大小一般是16KB,并且记录其实是被存放在页中。
如果记录占用的空间太大还可能造成行溢出现象,这会导致一条记录被分散存储在多个页中。

数据页结构的快速浏览

页的本质就是一块16KB大小的存储空间
InnoDB为了不同的目的而把页分为不同的类型,
其中用于存放记录的页也称为数据页,
数据页代表的这块16KB大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:


名称 中文名 占用空间 描述
File Header 文件头 38字节 一些描述页的信息
Page Header 页头 56字节 页的状态信息
Infimum + Supremum 最小记录和最大记录 26字节 两个虚拟的行记录
User Records 用户记录 不确定 实际存储的行记录内容
Free Space 空闲空间 不确定 页中尚未使用的空间
Page Directory 页目录 不确定 页中的记录相对位置
File Trailer 文件结尾 8字节 校验页是否完整
记录在页中的存储

在页的7个组成部分中,存储的记录会按照我们指定的行格式存储到User Records部分。
但是在一开始生成页的时候,其实并没有User Records这个部分,每当我们插入一条记录,都会从Free Space部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到User Records部分,当Free Space部分的空间全部被User Records部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了
过程的图示如下:


总结

  1. InnoDB为了不同的目的而设计了不同类型的页,用于存放我么记录的页也叫做数据页。

  2. 一个数据页可以被分为7个部分,分别是

  1. 每个记录的头信息中都有一个next_record属性,从而使页中的所有记录串联成一个单链表。
  2. InnoDB会为把页中的记录划分为若干个组,每个组的最后一个记录的地址偏移量作为一个槽,存放在Page Directory中,所以在一个页中根据主键查找记录是非常快的,分为两步:
  1. 每个数据页的File Header部分都有上一个和下一个页的编号,所以所有的数据页会组成一个双链表。

  2. 为保证从内存中同步到磁盘的页的完整性,在页的首部和尾部都会存储页中数据的校验和和LSN值,如果首部和尾部的校验和和LSN值校验不成功的话,就说明同步过程出现了问题。

上一篇 下一篇

猜你喜欢

热点阅读