InnoDB存储引擎和大多数数据库一样,记录是以行的形式存储的。也就是说页中保存着表中一行行的数据。在InnoDB 1.0.x版本之前,InnoDB存储引擎
提供了Compact和Redundant两种格式来存放行记录数据。
Redundant格式是为了兼容之前版本而保留的,如果阅读过InnoDB的源代码,用户会发现源代码中是用PHYSICAL RECORD(NEW STYLE)和PHYSICAL RECORD(OLD STYLE)来区分两种格式。
在MySql 5.1版本中,默认设置为Compact行格式。用户可以通过下面命令查看表使用的行格式,其中row_format属性表示当前所使用的行记录结构类型。
mysql> show table status like 'test'\G
*************************** 1. row ***************************
Name: test
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1
Avg_row_length: 16384
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 5242880
Auto_increment: NULL
Create_time: 2016-07-20 16:13:43
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
可以看到test表是Compact的行格式。数据库实例的作用之一就是读取页中存放的行记录。如果用户自己知道页中行记录的组织规则,也可以自行通过编写工具的方式来读取其中的记录。
1、Compact行记录格式
Compact行记录是在MySql 5.0中引入的,其设计目标是高效地存储数据。简单来说,一个页中存放的行数据越多,其性能就越高。下面是Compact行记录的存储方式:
Compact行记录格式的首部是一个非NULL变长字段长度列表,并且其是按照列的顺序逆序放置的,其长度是:
(1)若列的长度小于255字节,用1字节表示;
(2)若大于255个字节,用2字节表示;
变长字段的长度最大不可以超过2字节,这是因为在MySql数据中varchar类型的最大长度限制为65535。
变长字段之后的第二部分是NULL标志位,该位指示了该行数据中是否有NULL值,有则用1表示。该部分所占的字节应该为1字节。
接下来的部分是记录头信息(record header),固定占用5字节(40位),每位的含义如下图所示:
最后的部分是实际存储每个列的数据。NULL不占该部分任何空间,即NULL除了占有NULL标志位,实际存储不占有任何空间。
另外,每行数据除了用户定义的列外,还有两个隐藏列,事务ID列和回滚指针列,分别为6字节和7字节的大小。若InnoDB表没有定义主键,每行还会增加一个6字节的rowid列。
接下来用一个具体示例来分析Co