InnoDB行记录格式
MySQL中存储有3种:
1)server层格式:与存储引擎无关,Binlog存储常用的一种
2) 索引元组格式:InnoDB存取过程记录的中间状态,是InnoDB在内存中存储的格式
3 物理存储格式:记录在物理页面中的存储格式,即compact格式,与索引元组格式一一对应。
物理存储格式
InnoDB存储引擎和大多数数据库一样(如Oracle和Microsoft SQL Server数据库),记录是以行的形式存储的。这意味着页中保存着表中一行行的数据。到MySQL 5.1时,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据,Redundant是为兼容之前版本而保留的,如果你阅读过InnoDB的源代码,会发现源代码中是用PHYSICAL RECORD(NEW STYLE)和PHYSICAL RECORD(OLD STYLE)来区分两种格式的。MySQL 5.1默认保存为Compact行格式。你可以通过命令SHOW TABLE STATUS LIKE ‘table_name’来查看当前表使用的行格式,其中row_format就代表了当前使用的行记录结构类型。例如:
use mysql;
show table status like ‘user’\G
数据库实例的一个作用就是读取页中存放的行记录。如果我们知道规则,那么也可以读取其中的记录,如之前的py_innodb_page_info工具。下面将具体分析各格式存放数据的规则。
Compact行记录的格式
Compact行记录是在MySQL 5.0时被引入的,其设计目标是能高效存放数据。简单来说,如果一个页中存放的行数据越多,其性能就越高。Compact行记录以如下方式进行存储:
-变长字段长度列表:如果列的长度小于255字节,用1字节表示;如果大于255个字节,用2字节表示(变长字段的长度最大不可以超过2个字节,这也很好地解释了为什么MySQL中varchar的最大长度为65 535,因为2个字节为16位,即2^16-1=65 535)
-NULL标志位:表明该行数据是否有NULL值。占一个字节。
-记录头信息:固定占用5字节,每位的含义见下表:
在每个列的存储数据中,NULL不占该部分任何空间。此外还有两个隐藏列,事务ID列和回滚指针列,分别为6字节和7字节。若innodb表没有定义主键,每行还会增加一个6字节的rowid列。