4种不同类型的行格式,分别是Compact、Redundant、Dynamic和Compressed行格式
1 compact
如果表中没有允许存储 NULL 的列,则 NULL值列表 也不存在了,否则将每个允许存储NULL的列对应一个二进制位,二进制位按照列的顺序逆序排列,二进制位表示的意义如下:
二进制位的值为1时,代表该列的值为NULL。
二进制位的值为0时,代表该列的值不为NULL。
因为表record_format_demo有3个值允许为NULL的列,所以这3个列和二进制位的对应关系就是这样:
二进制位按照列的顺序逆序排列,所以第一个列c1和最后一个二进制位对应。
记录的真实数据
对于record_format_demo表来说,记录的真实数据除了c1、c2、c3、c4这几个我们自己定义的列的数据以外,MySQL会为每个记录默认的添加一些列(也称为隐藏列),具体的列如下:
列名是否必须占用空间描述
小贴士: 实际上这几个列的真正名称其实是:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,我们为了美观才写成了row_id、transaction_id和roll_pointer。
页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位。
指定和修改行格式的语法如下:
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称
InnoDB目前定义了4种行格式
COMPACT行格式
具体组成如图:
Redundant行格式
具体组成如图:
Dynamic和Compressed行格式
这两种行格式类似于COMPACT行格式,只不过在处理行溢出数据时有点儿分歧,它们不会在记录的真实数据处存储字符串的前768个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。
另外,Compressed行格式会采用压缩算法对页面进行压缩。
一个页一般是16KB,当记录中的数据太多,当前页放不下的时候,会把多余的数据存储到其他页中,这种现象称为行溢出。