文章插图
- 变长字段列表:如varchar(m),Text,Blob类型的列,称为变长字段,由于其字节数量不固定,需要在变成字段列表中存储这些字段的长度,在记录的真实数据中存储内容
- null值列表:如果表中没用允许为null的列,那么null值列表就不存在,否则把每一个允许为null的列使用一个二进制位来表示,二进制为1的时候表示值为null
- 记录头信息:占用五个字节,其中包含delete_flag(标记记录是否被删除),next_record(下一条记录的相对位置)等信息
- 记录的真实信息:如果表没用定义主键,也没有唯一不可重复不可为null的列,那么innodb为我们生成一个隐藏列row_id,如果定义了主键那么此列不存在,并且还有trx_id,roll_pointer两个隐藏列,后续便是每一个列的真实数据 。(char(M)类型的列,如果使用定长字符编码,那么字节数不会加到变长字段列表中,如果使用变长编码,占用长度会加入到变成字段列表中(变长编码那么必须占用M个字节,varchar(M)则没用这个要求)

文章插图
- 字段长度偏移列表:此种行格式会把记录所有列长度的偏移信息存储
- null值的处理方式:先看偏移量的null比特位是否为1,如果为了那么表示为null
如果一个列太长,并不会傻乎乎的存储所有数据在行记录中,而是使用
溢出列,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,第一个变长字段的长度)右边是记录的真实数据(顺序存放),且可以使记录中靠前字段和对应的字段信息在内存中更近,提高高速缓存的命中率 。这里我们可以看到被删除的记录没用立即被清除,只是不会被经验总结扩展阅读- 十二星座喜欢通过什么小细节秀恩爱
- 新房装修验收注意哪些细节
- 用golang开发系统软件的一些细节
- 记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节
- 火影忍者究极风暴怎么调整画质
- 发朋友圈的七种步骤(发朋友圈的细节和技巧)
- 库克首次回应iPhone13的细节_iphone13官方最新消息
- 上官婉儿怎么免伤害连招(上官婉儿怎么玩连招细节)
- 电视剧忠者无敌演员表介绍?
- 丑女无敌结局是什么?
 

 
   
   
   
   
   
   
   
   
   
   
   
  