在早期的innodb版本中,由于文件格式只有一种,但随着innodb引擎的发展,开发出了兼容早期版本的新文件格式,用于支持新的功能,因此InnoDB开始使用命名的文件格式
- Antelope:先前命名的,原始的InnoDB文件格式,支持两种行格式,compact和redundant,
- Barracuda:新的文件格式,它支持innoDB的所有行格式,而且包括新的行格式:compressed和dynamic
- Compact
compact行记录是在mysql5.0中引入的,为了搞笑的存储数据,简单的说,就是为了让一个页存放的行记录更多,这样利用率就越高,行记录的格式如下:
变长字段列表 | NULL标志位 | 记录头信息 | column1数据 | column2数据 | 额外数据 |
变长字段长度列表:如果定义长度小于128字节或者小于256字节且类型不是blob,那么这个字段的数据长度就用一个字节来存储,除了上面两种情况之外,都用两个字节来存储;
NULL标识位:该位指示了该行数据中是否有null值,有则用1来标识;
记录头信息:固定占用50字节;
cloumnN数据:实际存储每列的数据,null不占该部分任何空间,即null占有null标志位,实际存储不占任何空间
ps:每一行数据除了用户定义的例外,还有两个隐藏列,事务id列和回滚指针列,分别为6字节和7字节的大小,若innodb表没有定义主键,每行还会增加一个6字节的rowid列
2、Redundant(mysql5.0之前的行记录格式)
字段便宜列表 | 记录头信息 | rowid | 事务id | 回滚指针 | 列1 | 列2 | 列n |
字段偏移列表:同样是按照列的顺序逆序放置的,若列的长度小于255字节,用一字节表示,若大于255字节,用2字节表示;
记录头信息:占用6字节
3、行溢出数据
当行记录的长度没有超过记录最大长度时,所有数据都会 存储在当前页;
当行记录的长度超过行记录最大长度时,变长列会选择外部溢出页进行存储;
对于compact和redundant,保留前768字节在当前页,其余数据存放在溢出页768字节后面跟着20字节的数据,用来存储指向溢出页的指针
4、对于compact和redundant行格式,innodb将变长字段(varchar varbinary blob text)的前786字节存储在B+树节点中,其余的数据存放在溢出页,
5、compressed和dynamic
innodb1.0开始引入新的文件格式,这个新的格式拥有两种新的行记录格式:compressed和dynamic,新的两种记录格式对于存放blob中的数据采用了完全的行溢出的方式:
dynamic行格式,列存储是否放到off-page页,主要取决于行大小,他会把行中最长的一列放到off-page中,直到数据页能存放下两行;
compressed物理结构上与dynamic类似,compressed行记录格式的另一个功能就是存储在其中的行数据会议zlib的算法进行压缩,因此对于blob text varchar这类大长度数据能够进行有效的存储(减少40%,但对cpu要求更高)