1.前言
在mysql中我们在插入数据的时候主要是以记录为单位向表中插入数据的,这些记录在磁盘中存放的形式也被称为行格式或者记录格式,innodb存储引擎设计的行格式主要有如下4种:1)compact 2)redundant 3)dynamic 4)compressed
2.指定行格式的语法
create table 表名(列信息) row_format=行格式名称 alter table 表名 row_format=行格式命令
3.compact
变长字段长度列表 | NULL值列表 | 记录头信息 | 列1的值 | 列2的值 | ...... | 列n的值 |
其中,上面的内容可以分为两个部分,前三个方框的内容可以被概括为记录的额外信息,后面的被称为记录的真实数据
3.1 变长字段长度列表
我们都了解mysql支持一些变长的数据类型,比如varchar(M)varibinary(M) 各种TEXT类型,各种BLOB类型。我们可以把这些数据类型的列称为变长字段。变长字段中存储多少字节的数据是不固定的,所以我们在存储真实数据库的时候需要顺便把这些数据占用的字节数也存起来,这样才不至于把mysql服务器搞懵逼。也就是说这些变长字段占用的存储空间分为两部分:
- 真正的数据内容
- 该数据占用的字节数
在compact行格式中,所有变长字段的真实数据占用的字节数都存放在记录的开头位置,从而形成一个变长字段长度列表,各变长字段的真实数据占用的字节数按照列的顺序逆序存放,比如说如下的某张表的记录,假设各个列采用的都是ascii字符集,每个字符只需要一个字节来编码,来看一下第一条记录各变长字段内容的长度。
列名 | 存储内容 | 内容长度(十进制) | 内容长度(十六进制) |
c1 | 'aaaa' | 4 | 0x04 |
c2 | 'bbb' | 3 | 0x03 |
c3 | 'd' | 1 | 0x01 |
因为这些长度值需要按照列的顺序的逆序存放,所以最后变长字段长度列表的字节串用十六进制表示的效果是: 01 03 04