页是MySQL管理存储空间的基本单位,一个页的大小一般是16KB,记录是被存放在页中的,如果记录占用的空间太大还可能造成行溢出现象,这会导致一条记录被分散存储在多个页中。
页的本质就是一块16KB大小的存储空间,InnoDB为了不同的目的而把页分为不同的类型,其中用于存放记录的页也称为数据页,我们先看看这个用于存放记录的页长什么样。数据页代表的这块16KB大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:
记录在页中的存储
在页的7个组成部分中,存储的记录会按照指定的行格式存储到User Records部分。但是在一开始生成页的时候,其实并没有User Records这个部分,每当插入一条记录,都会从Free Space部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到User Records部分,当Free Space部分的空间全部被User Records部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了,这个过程的图示如下:
记录头信息的秘密
delete_mask 这个属性标记着当前记录是否被删除,占用1个二进制位,值为0的时候代表记录并没有被删除,为1的时候代表记录被删除掉了。
这些被删除的记录之所以不立即从磁盘上移除,是因为移除它们之后把其他的记录在磁盘上重新排列需要性能消耗,所以只是打个删除
标记而已,而且这部分存储空间之后还可以重用,也就是说之后如果有新记录插入到表中的话,可能把这些被删除的记录占用的存储空
间覆盖掉。`optimize table 表名;` 执行这个命令后服务器会重新规划表中记录的存储方式,把被标记为删除的记录从磁盘上移除。
min_rec_mask 这个属性标记该记录是否为B+树的非叶子节点中的最小记录。
n_owned 这个暂时保密,稍后它是主角~
heap_no 这个属性表示当前记录在本页中的位置。InnoDB自动给每个页里加了两个记录,由于这两个记录并不是自己插入的,所以有时候也称为伪记录或者虚拟记录。这两个伪记录一个代表最小记录,一个代表最大记录。对于一条完整的记录来说,比较记录的大小就是比较主键的大小。比方说插入的4行记录的主键值分别是:1、2、3、4,这也