4.2 InnoDB页简介
InnoDB是将表中数据存储到磁盘上的存储引擎。将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,一个页的大小一般为16KB。
4.3 InnoDB行格式
可以在创建或修改表的的语句中指定记录所使用的行格式:
CREATE TABLE 表名 (列的信息) ROW_FORMAT = 行格式名称;
ALTER TABLE 表名 ROW_FORMAT = 行格式名称;
CPMPACT行格式
一条完整的记录被分为记录的额外信息和记录的真实数据两部分。
- 记录的额外信息
这部分信息是服务器为了更好管理记录不得不额外添加的一些信息,分为三个部分:
- 变长字段长度列表
MySQL支持一些变长的数据类型,比如VARCHAR、VARBINARY、各种TEXT类型、各种BLOB类型。因而可以将拥有这些数据类型的列称为变长字段。变长字段中存储多少字节是不固定的,所以需要在存储真实数据时顺便把占用的字节数也存起来。
在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部分,从而形成一个变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放。
- NULL值列表
一条记录的某些列可能存储NULL值,如果都放到记录的真实数据中会占地方,所以CPMPACT行格式把一条记录中值为NULL的列统一管理起来,存储到NULL值列表中。
步骤如下:
① 首先统计表中允许存储NULL值的列有哪些;
② 如果表中没有允许存储NULL的列,则NULL值列表就不存在了,否则将每个允许存储NULL的列对应于一个二进制位,二进制位按照列的顺序逆序排列。二进制位为1,代表该列值为NULL;反之不为NULL。
③MySQL规定NULL值列表必须用整数个字节的位表示,缺则补齐:
- 记录头信息
除了变长字段长度列表、NULL值列表外,还有一个部分——记录头信息。由固定的5字节组成,用于描述记录的一些属性:
- 记录的真实数据
对于一个表来说,记录的真实数据除了我们自己定义的的列的数据外,MySQL还会默认添加一些列:
InnoDB表的主键优先使用用户自定义的主键,如果用户没有定义主键,则选取一个不允许存储NULL值的UNIQUE键作为主键;如果都没有的话,就默认添加一个名为row_id的隐藏列作为主键。
溢出列
在COMPACT和REDUNDANT行格式中,对于占用存储空间非常多的列,在记录的真实数据处只会存储该列的一部分数据,而把剩余的数据分散存储在几个其他的页中,然后在记录的真实数据处用20字节存储指向这些页的地址,从而可以找到剩余数据所在的页。
对于COMPACT来说,如果某一列中的数据非常多,则在本记录的真实数据处只会存储该列前768字节的数据以及一个指向其他页的地址。
DYNAMIC行格式和COMPRESSED行格式
MySQL v5.7默认的行格式就是DYNAMIC。它们与COMPACT很类似,只在处理溢出列的数据时不一样:
它们不在记录的真实数据处存储该溢出列真实数据的前768个字节,而是把该列的所有真实数据都存储到溢出页中,只在真实数据处存储20字节指向溢出页的地址。
此外,COMPRESSED不同于DINAMIC行格式的是:COMPRESSED行格式会采用压缩算法对页面进行压缩以节省空间。