一、页结构说明
大致分7部分
二、记录在页中的存储
2.1 页面记录内存结构
行格式 存储到 User Records 部分,每当我们插入一条记录,都会从 Free Space 部分申请一个记录大小的空间划分到 User Records 部分 ,用完则申请新的页;
User Records记录行数据-> Free Space 空间->用完则申请下一页面
mysql> CREATE TABLE page_demo(
-> c1 INT,
-> c2 INT,
-> c3 VARCHAR(10000),
-> PRIMARY KEY (c1) -> )
CHARSET=ascii ROW_FORMAT=Compact; Query OK, 0 rows affected (0.03 sec)
行格式,头信息
mysql> INSERT INTO page_demo VALUES
(1, 100, 'aaaa'), (2, 200, 'bbbb'), (3, 300, 'cccc'), (4, 400, 'dddd');
Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
数据存储行信息示意图:
1、delete_mask:1个二进制位,值为 0 的时候代表记录并没有被删除,为 1 的时 候代表记录被删除掉了;数据分两步加入垃圾链表???
2、min_rec_mask B+树的每层非叶子节点中的最小记录都会添加该标记。
3、heap_no 当前记录在本页 中的位置;0,1是mysql默认的两个伪记录,代表最小值和最大值。
不存放在 页 的 User Records 部分,他们被单独放在 一个称为 Infimum + Supremum 的部分;
****按照主键从小到大的顺序形成了一个单链表*****
2.2 删除数据链表变化
1、第2条记录并没有从存储空间中移除,而是把该条记录的 delete_mask 值设置为 1 。
2、第2条记录的 next_record 值变为了0,意味着该记录没有下一条记录了。
3、第1条记录的 next_record 指向了第3条记录。
4、还有一点你可能忽略了,就是 最大记录 的 n_owned 值从 5 变成了 4。
不论增删改操作,InnoDB始终会维护一条记录的单链表,链表中的各个节点是按照主键值由小到大的顺序连接起来的。
第二条存储空间却没有回收,再次把这 条记录插入到表中,会发生什么事呢?
mysql> INSERT INTO page_demo VALUES(2, 200, 'bbbb');
InnoDB 并没有因为新记录的插入而为它申请新的存储空间,而是直接复用了原来被删除记录 的存储空间;(重用垃圾链表的存储空间)
三、Page Directory(页目录)