如果一个列太长,并不会傻乎乎的存储所有数据在行记录中,而是使用
溢出列
, COMPACT
和REDUNDANT
只会存储该列的前768字节然后存储指向其他页的地址,剩下的数据存在其他页中 。和
COMPACT
类似,但是二者不会存储过长列的前768字节,而是把真实数据都存储到溢出中 , 记录只存储溢出页的地址 。COMPRESSED
还会使用压缩算法对页面
进行压缩存放Change Buffer的页
, 存储undo log 日志的页
等等 。对于表中数据,也存在在页中
文章插图
最开始的时候UserRecords并不存在,随着数据的插入,会从FreeSpace中申请一个记录大小的空间,将其划分到UserRecords部分,当FreeSpace用完只会继续插入就需要申请新的页 。
2.1行结构中记录头信息的作用
- deleted_flag:标记是否被删除,1表示被删除,被删除的列表通过next_record串联起来,并且会记录被删除记录的空火箭,这部分空间可以重复使用
- min_rec_flag: B+树每层非叶子节点,最小的目录项记录会被添加此标记
- n_owned:
- heap_no:
UserRecords
中存储的用户记录是紧凑如同堆
一样排布的,heap_no是堆中记录的编号 , 从2开始(0和1 被infimum+supremum占用,infimum虚拟的最小记录,supremum虚拟最大记录)
- next_record:表示当前记录的真实数据,到下一条记录的距离
文章插图
next_record
左边是变长字段列表
和null
值列表(二者都是逆序存放信息,也就是说距离next_record最近的是第一个字段是否为null,第一个变长字段的长度)右边是记录的真实数据
(顺序存放),且可以使记录中靠前字段和对应的字段信息在内存中更近,提高高速缓存的命中率 。这里我们可以看到被删除的记录没用立即被清除,只是不会被next_record
串联起来
记录按照主键从小到大形成单向链表
- 页目录生成过程
- 将infimum,supermum以及所有未被删除的记录 , 分成多个组
- 每一个组中最大的记录的
n_owned
存储组中记录条数 - 将每一个组中最后的记录在页面中的地址偏移量,存储到页面尾部——
Page Directory
中,这些地址偏移量称为槽
文章插图
- 根据查询页面记录的过程
通过二分法找到目标记录中的槽,然后遍历槽所在组的所有记录

文章插图
目录项记录的只是主键值和页号两个列 , 最下方是我们刚刚讲到的innoDB存储用户记录的页 。如果页面数据量很大,可以继续为目录项建立目录项

文章插图
3.2 根据目录项定位数据行的过程例如查找主键为10记录
- 根据目录项中的内容,确定目标记录所在的页
如上图页33 存在记录(1,30),(320 32),可以判断主键位于1~320范围的记录在页30,大于320的记录在页32
- 找到页30后还要继续在页30中,通过目录项记录的页确定目标记录真正所在的页
- 在真正存储用户记录的页(页28)中通过槽定位到组,然后遍历槽所在组的所有记录
推荐阅读
- 记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节
- 发朋友圈的七种步骤(发朋友圈的细节和技巧)
- 库克首次回应iPhone13的细节_iphone13官方最新消息
- 上官婉儿怎么免伤害连招(上官婉儿怎么玩连招细节)
- 英雄无敌类网游小说推荐 英雄无敌类网游
- 关于劳力士格林尼治可乐圈复刻表做工细节怎么样
- 细节作文800字高中议论文 爱在细节处高中作文800字
- 英雄无敌3历代记是什么 英雄无敌3历代记是什么?
- 梧州藤县男孩走失三天获救,警方披露搜救细节,孩子是如何被找到的?
- 假面骑士空我究极形态和假面骑士ghost无限魂形态哪个厉害?