innodb文件格式

Antelope:为兼容之前版本格式总称(mysql5.5)

Barracuda:Innodb plugin及innodb1.1(mysql5.5)提供的新文件格式。

注意Barracuda是包括Antelope格式的.


一、Antelope 

Antelope文件格式包括compact和redundant两种行记录模式

MySQL 5.1中内置Innodb存储引擎(Built-in-InnoDB)提供了Compact和Redundant两种记录数据格式,Redundant是为兼容mysql5.0之前版本保留的。默认格式为compact格式(mysql5.5不设置innodb_file_format默认也是compact)。

查看当前表使用的行格式:show table staus like 'table_name' ;

对于compact行记录模式:不管char还是varchar类型,NULL值都不占用存储空间。

对于redundant行记录模式:varchar类型的NUL值不占用存储空间,而char类型需要占用存储空间。

二、Barracuda

Barracuda文件格式包括dynamic和compressed两种行记录模式。当前bug较多。

Innodb plugin和innodb1.1(mysql5.5)引入新的文件格式Barracuda。

compressed可以对行数据以zlib算法压缩



三、溢出

InnoDB 数据页以B-tree形式存储。第二索引也是b-tree树,第二索引包含主键,是先找到主键然后根据主键取行。
变长字段(VARCHAR,text,blob)当太长不能存储在一个页上时将被分配在单独的磁盘页上(称为overflow,溢出页)。这些列称为溢出页的列(off-page列)。这些列的值以单链表方式将存放的溢出页组织存储,每个这样的列具有自己的一个或者多个溢出页的列表。在某些情况下,长的列值的前缀(或者全部值)被存储在B-tree树中,避免浪费存储,消除了读取单独页的浪费。新的 Barracuda 文件格式提供了一个新的选项来控制这样列的多少部分将被存储在聚簇索引中,多少部分被存储在溢出页中。

Antelope会存768个前缀字节,Barracuda只存20个字节指针

Antelope(COMPACT 和 REDUNDANT )
表被定义为row_format=COMPACT(或REDUNDANT),InnoDB 将存储可变长列的前768字节在Btree节点索引中,其它存储在溢出页中。
为了对之前版本兼容,InnoDB Plugin和InnoDB1.1(MYSQL5.5)默认文件格式是Antelope行记录格式是COMPACT。

使用Antelope 时,如果一个列的值不足 768 字节,将不需要溢出页,这对于相对较短的BLOB 是没有问题的,但是可能引起Btree 节点做不必要的数据填充。 带有多个BLOB 列的表可能引起Btree 节点太慢,从而使得可以包含的行太少,使得索引相对于稍短的行的情况或者列值以溢出页存储的情况的效率要低。

innodb_file_format 为Barracuda 时,如果创建 row_format = DynaMIC(或COMPRESSED),较长的列的值完全以溢出页存储,聚簇索引只存放到溢出页的指针。是否存储在溢出页中取决于页的大小和行的总大小,如果行太大,InnoDB 将选择最长的列来存直到聚簇索引可以放在Btree 页上为止。

DYNAMIC 行格式维持了在索引节点中存储整行的效率,如果恰好可以放下(正如COMPACT 和 REDUNDANT 格式那样),但是这种新的格式避免了对较长的列使用较多数据来填充Btree 节点的问题。DYNAMIC 格式考虑的是如果一个较长的数据的一部分需要存储在溢出页上,那么通常最有效的方式就是将所有数据都存储在溢出页上。较短的列仍然会存放在Btree 节点上,可以减少对任何给定行所需的最少溢出页的数量。




你可能感兴趣的:(mysql)