InnoDB行记录格式总结

在早期的innodb版本中,由于文件格式只有一种,但随着innodb引擎的发展,开发出了兼容早期版本的新文件格式,用于支持新的功能,因此InnoDB开始使用命名的文件格式

  • Antelope:先前命名的,原始的InnoDB文件格式,支持两种行格式,compact和redundant,
  • Barracuda:新的文件格式,它支持innoDB的所有行格式,而且包括新的行格式:compressed和dynamic

 

  1. 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要求更高)

 

你可能感兴趣的:(MYSQL常用知识分类)