四种格式下的信息表如下:
Redundant | 字段长度偏移列表,记录头信息(5.0以前的格式) |
---|---|
Compact | 变长字段长度列表,NULL值列表,记录头信息 |
Dynamic | 变长字段长度列表,NULL值列表,记录头信息(5.7的默认格式) |
Compressed | 变长字段长度列表,NULL值列表,记录头信息 |
一、记录一行数据中额外的数据
1.1、变长字段长度列表:
-
如果变长字段占据的最大字节数小于等于255,直接用一个字节存储数据。
-
如果变长字段占据的最大字节数大于255:
- 如果实际占据的字节数小于等于127,使用一个字节存储数据。
- 如果实际占据的字节数大于127,则使用两个字节存储数据。
对于 CHAR(M) 类型的列来说,当列采用的是定长字符集(如:ASCII字符集)时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集(如:gbk,utf8)时,该列占用的字节数也会被加到变长字段长度列表。
1.2、字段长度偏移列表:
-
存储所有列的长度信息,包括隐藏列,也是与列字段相反的逆序存储。
-
直接存储的是偏移量,通过两个偏移量之间的差值来计算占用长度,存储偏移量使用一个字节或者两个字节,并在记录头信息中的1byte_offs_flag记录,留作解析偏移量时判断使用的是一个字节存储还是两个字节存储。
- 一个字节:如果整条记录的真实记录数据小于127字节,直接用一个字节存储。
- 两个字节:如果整条记录的真实记录数据大于127字节则用两个字节储存,但超过32767字节时,会存储一部分数据,其余得存入溢出页,本页只保存一部分数据和溢出页的地址。
对于 CHAR(M) 类型的列来说,无论使用的字符集是否为定长字符集,最终存储的结果都为存储所需的最大字节数。
2.1、NULL值列表:
- 允许为NULL的字段中存储的是否为NULL,0代表不是NULL,1代表是NULL。按照列顺序逆序排列。
2.2、Redundant格式的NULL值处理:
- 定长类型的字段:直接在记录真实数据的地方使用长度为定长的0填充。
- 变长类型的字段:不占据存储空间。
3、记录头信息:
- 用于描述记录的其他信息。
二、记录真实数据
-
表中可见字段,即使用者自定义的字段。
-
表隐藏字段:
- DB_ROW_ID(非必须):行ID,代表唯一一条记录,由InnoDB自己生成。如果使用者自定义了主键,或者可以找到Unique键作为主键的话,则不生成此隐藏列。否则以此隐藏列作为主键。
- DB_TRX_ID:事务ID。
- DB_ROLL_PTR:回滚指针。
三、对于溢出的处理
- Compact和Reduntant格式:自身存储一部分数据和溢出页的地址,溢出的数据存入溢出页。
- Dynamic格式:不会存储一部分数据,直接把溢出的所有数据存入溢出页,记录位置只存放溢出页的地址。
- Compressed格式:与Dynamic存储方式一致,但是会采用压缩算法进行压缩,以节省空间。
一个行中的所有列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节,不同的字符集对于一个字符对应几个字节也是不同的,所以在定义长度时要根据实际情况而定。