暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL NULL值列表

Ty3306 2022-09-09
1229

NULL值列表
Compact行格式会把可以为NULL的列统一管理起来,存在一个标记为NULL值列表中。如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在了。

为什么定义NULL值列表?

之所以要存储NULL是因为数据都是需要对齐的,如果没有标注出来NULL值的位置,就有可能在查询数据的时候出现混乱。如果使用一个特定的符号放到相应的数据位表示空置的话,虽然能达到效果,但是这样很浪费空间,所以直接就在行数据得头部开辟出一块空间专门用来记录该行数据哪些是非空数据,哪些是空数据,格式如下:

二进制位的值为1时,代表该列的值为NULL。
二进制位的值为0时,代表该列的值不为NULL。
注意:同样顺序也是反过来存放的

例如:字段a、b、c,其中a是主键,在某一行中存储的数依次是a=1、b=null、c=2。那么Compact行格式中的NULL值列表中存储:01。第一个0表示c不为null,第二个1表示b是null。这里之所以没有a是因为数据库会自动跳过主键,因为主键肯定是非NULL且唯一的,在NULL值列表的数据中就会自动跳过主键。

record_test_table的两条记录的NULL值列表就如下:


7.3.2.3、记录头信息(5字节)



INSERT INTO page_demo VALUES
(1,100,'song'),(2,200,'tong'),(3,300,'zhan'),(4,400,"list");


delete_mask:这个属性标记着当前记录是否被删除,占用1个二进制位。
值为0:代表记录并没有被删除
值为1:代表记录被删除掉了
# 被删除的记录为什么还在页中存储呢?
- 你以为它删除了,可它还在真实的磁盘上。这些被删除的记录之所以不立即从磁盘上移除,是因为移除它们之后其他的记录在磁盘上需要`重新排列,导致性能消耗`。所以只是打一个删除标记而已,所有被删除掉的记录都会组成一个所谓的`垃圾链表`,在这个链表中的记录占用的空间称之为`可重用空间`,之后如果有新记录插入到表中的话,可能把这些被删除的记录占用的存储空间覆盖掉。
1
2
min_rec_mask:B+树的每层非叶子节点中的最小记录都会添加该标记,min_rec_mask值为1。我们自己插入的四条记录的min_rec_mask值都是0,意味着它们都不是B+树的非叶子节点中的最小记录。
record_type:这个属性表示当前记录的类型,一共有4种类型的记录:
0:表示普通记录
1:表示B+树非叶节点记录
2:表示最小记录
3:表示最大记录
heap_no:这个属性表示当前记录在本页中的位置。
# 怎么不见heap_no值为0和1的记录呢 ?
- MySQL会自动给每个页里加了两个记录,由于这两个记录并不是我们自己插入的,所以有时候也称为`伪记录`或者`虚拟记录`。这两个伪记录一个代表`最小记录`,一个代表`最大记录`。最小记录和最大记录的heap_no值分别是0和1,也就是说它们的位置最靠前

n_owned:页目录中每个组中最后一条记录的头信息中会存储该组一共有多少条记录,作为 n_owned 字段
next_record:记录头信息里该属性非常重要,它表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量。
比如:第一条记录的next_record值为32,意味着从第一条记录的真实数据的地址处向后找32个字节便是下一条记录的真实数据。

注意,下一条记录指得并不是按照我们插入顺序的下一条记录,而是按照主键值由小到大的顺序的下一条记录。而且规定Infimum记录(也就是最小记录)的下一条记录就是本页中主键值最小的用户记录,而本页中主键值最大的用户记录的下一条记录就是
Supremum记录(也就是最大记录)。下图用箭头代替偏移量表示next_record。



从图中可以看出来,删除第2条记录前后主要发生了这些变化:

第2条记录并没有从存储空间中移除,而是把该条记录的delete_mask值设置为1.
第2条记录的next_record值变为了0,意味着该记录没有下一条记录了
第1条记录的next_record指向了第3条记录
最大记录的n_owned值从5变成了4.
所以,不论我们怎么对页中的记录做增删改操作,InnoDB始终会维护一条记录的单链表,链表中的各个节点是按照主键值由小到大的顺序连接起来的。











「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论