1、InnoDB数据行格式
2021-10-11 10:27:51 1 举报
详细解释InnoDB引擎中常用的数据行格式
作者其他创作
大纲/内容
我们经常在表中使用一下变长字段例如varchar、text,这些字段的长度都是不固定的。这就很容易搞混乱。compact格式在记录开头部分存储每一条真实数据的变长字段长度。但是需要注意的是这些长度存放的顺序与真正的列数据顺序逆序存放,font color=\"#000000\" style=\"\
如果某个变长字段为NULL,那么该列表将不存储。并不是所有记录都有这个 变长字段长度列表 部分,比方说表中所有的列都不是变长的数据类型的话,这一部分就不需要有。
我们每一次执行插入操作都是在添加一行数据,而在InnoDB当中每一行都有它所对应的的行格式。有以下几种compact、redundant、dynamic、compressed
字段长度偏移列表
记录头信息
变长字段长度列表顺序
第N列数据
假设数据存放的长度是:1:长度为202:长度为163:长度为90当然真实列表中存放的长度都是经过进制转换的
delete_mask标记该记录是否被删除
n_owned表示当前记录拥有的记录数
20
部分真实数据
记录真实数据
Dynamic和Compressed行格式在mysql5.7中默认使用的是Dynamic。这两种行格式与compact非常相似,只不过在处理溢出的时候不太一样。它们会将溢出的所有数据全部放在溢出页当中,真实数据存储的是溢出页的地址。Compressed行格式和Dynamic不同的一点是,Compressed行格式会采用压缩算法对页面进行压缩,以节省空间。
1、会记录所有字段的长度信息包括隐藏列,并按照逆序顺序排列2、多了偏移两个字所有它存储的并没有那么直观,而是采用两个相邻数值的差值来计算各个列值得长度
第一列数据
记录:
列顺序
a
事务ID
NULL值列表
row_id
记录头信息中存储着固定的5个字节,也就是二进制的40位,(1字节=8位)而且不同的一段位表示不同的意思
记录额外数据
回滚指针
溢出页
在真实数据当中除了这些我们自己存的数据之外,还有一些其他的列数据,我们称之为隐藏列
next_record表示下一条记录的相对位置
第...列数据
heap_no表示当前记录在记录堆的位置信息
指向溢出页地址
c
变长字段长度列表
行溢出的临界值1、MYSQL中规定每页必须至少存储两行数据。2、每页除了存放真实数据之外还有一些其他乱七八糟的数据一共加起来有132个字节3、每列记录需要存储的额外信息有27字节综合以上条件,假设一列需要存储的字节为n,如果该列不出现行溢出就需要满足以下条件127+2*(27+n) <16384只要符合这个公式那么mysql就不会判定该列是一个溢出列,但需要注意的是这只是按照单列去算的,如果表中有多个列,那么这个公式就需要改动了!
预留位1
min_rec_maskB+树的每层叶子节点中最小纪录都会添加该标记
roll_pointer
行ID,唯一标识
行溢出问题MYSQL中内存与磁盘交互的基础单位是页,而每一页最大为16KB,也就是16384个字节。但是在一个列中或者是一行中数据的大小很有可能完全超过这个大小,比如varchar类型就可以设置65535个字节大小。这就会出现一页存不下一行数据的尴尬局面。在compact和redundant格式中,他们只存储一部分真实数据,把剩余的数据放在一个溢出页当中,并在尾部记录相应的地址
90
在列的值允许为NULL的情况下,gbk字符集下M的最大取值就是32766,utf8字符集下M的最大取值就是21844,这都是在表中只有一个字段的情况下说的,一定要记住一个行中的所有列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节!
际上这几个列的真正名称其实是:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,我们为了美观才写成了这样
redundant
transaction_id
data
16
compact
record_type表示当前记录的类型0:表示普通记录1:表示B+树非叶子节点记录2:表示最小记录3:表示最大记录
b
在记录头信息中redundant格式比compact格式多出了两个信息字段n_field:表示记录中列的数量1byte_offs_flag:标记字段长度偏移列表中每个列对应的偏移量是使用1字节还是2字节表示的
预留位2
0 条评论
下一页