在早期的InnoDB版本中,因为文件格式只有一种,所以不须要为此文件格式命名。随着InnoDB引擎的发展,开发出了不兼容早期版本的新文件格式,用于支持新的功能。为了在升级和降级状况下帮助管理系统的兼容性,以及运行不一样的MySQL版本,InnoDB开始使用命名的文件格式。html
目前,InnoDB只支持两种文件格式:Antelope 和 Barracuda。mysql
innodb_file_format 配置能够启用InnoDB文件格式。默认值为Antelope。sql
有三种方式能够修改 innodb_file_format 参数的值:命令行
mysql> SET GLOBAL innodb_file_format=Barracuda; Query OK, 0 rows affected (0.00 sec)
尽管MySQL推荐使用 Barracuda 文件格式,可是MySQL5.6的默认文件格式是 Antelope。指针
当使用 innodb_file_format 参数启用不一样的文件格式后,只有新建立的表会使用此文件格式。code
有两种方式能够查看表使用的文件格式:orm
mysql> SHOW TABLE STATUS\G *************************** 1. row *************************** Name: t1 Engine: InnoDB Version: 10 Row_format: Compact Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 16384 Data_free: 0 Auto_increment: 1 Create_time: 2014-11-03 13:32:10 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment: mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME='test/t1'\G *************************** 1. row *************************** TABLE_ID: 44 NAME: test/t1 FLAG: 1 N_COLS: 6 SPACE: 30 FILE_FORMAT: Antelope ROW_FORMAT: Compact ZIP_PAGE_SIZE: 0 mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME='test/t1'\G *************************** 1. row *************************** SPACE: 30 NAME: test/t1 FLAG: 0 FILE_FORMAT: Antelope ROW_FORMAT: Compact or Redundant PAGE_SIZE: 16384 ZIP_PAGE_SIZE: 0
设置了指定文件格式的InnoDB表空间文件(.idb文件)被用来建立表和索引。能够经过重建表和表中索引的方式修改文件格式。重建表及其索引的最简单的方法是在要修改的表上执行下面命令:htm
ALTER TABLE t ROW_FORMAT=format_name;
接下来介绍这些行格式支持的功能,以及如何选择正确的行格式。索引
InnoDB表的数据存储在页(page)中,每一个页能够存放多条记录。这些页以树形结构组织,这颗树称为B树索引。表中数据和辅助索引都是使用B树结构。维护表中全部数据的这颗B树索引称为聚簇索引,经过主键来组织的。聚簇索引的叶子节点包含行中全部字段的值,辅助索引的叶子节点包含索引列和主键列。ci
变长字段是个例外,例如对于BLOB和VARCHAR类型的列,当页不能彻底容纳此列的数据时,会将此列的数据存放在称为溢出页(overflow page)的单独磁盘页上,称这些列为页外列(off-page column)。这些列的值存储在以单链表形式存在的溢出页列表中,每一个列都有本身溢出页列表。某些状况下,为了不浪费存储空间和消除读取分隔页,列的全部或前缀数据会存储在B+树索引中。
可在 CREATE TABLE 和 ALTER TABLE 语句的 ROW_FORMAT 子句指定表的行格式。例如:
CREATE TABLE t1 (f1 int unsigned) ROW_FORMAT=DYNAMIC ENGINE=INNODB;
InnoDB的ROW_FORMAT取值包含:COMPACT, REDUNDANT, DYNAMIC 和 COMPRESSED。对于InnoDB表,默认的行格式为:COMPACT。
InnoDB表中行的物理结构由行格式决定。更多信息查看:Physical Row Structure of InnoDB Tables
对于 COMPACT 和 REDUNDANT 行格式,InnoDB将变长字段(VARCHAR, VARBINARY, BLOB 和 TEXT)的前786字节存储在B+树节点中,其他的数据存放在溢出页中。InnoDB也会将大于等于786字节的固定长度字段转换为变长字段,以便可以在页外存储。例如,一个类型为 char(255) 的列,若此列字符集的最大字节长度超过3个字节,则它可能超过786字节,就像字符集 utf8mb4。
使用Antelope文件格式,若字段的值小于等于786字节,不须要溢出页,由于字段的值都在B+树节点中,因此会下降I/O操做。这对于相对较短的BLOB字段有效,但可能因为B+树节点存储过多的数据而致使效率低下。
为了保持与先前InnoDB版本的兼容性,MySQL5.6建立的表默认文件格式为 COMPACT。
要想使用这两种文件格式,变量 innodb_file_format 的值必须设置为:Barracuda,同时必须开启 innodb_file_per_table 功能。(Barracuda文件格式也支持 COMPACT 和 REDUNDANT 行格式。)
当建立表时指定行格式为 DYNAMIC 或 COMPRESSED,InnoDB能够将边长字段的值所有存储在溢出页中,而聚簇索引页中只包含指向溢出页的长度为20字节的指针。跟 COMPACT 行格式同样,InnoDB也会将长度大于等于786字节的定长字段转换为边长字段。
列是否存储到溢出页取决于页的大小和行的大小。若行太长,InnoDB会将最长的列存储到溢出页中,直到聚簇索引记录可以放在B+树页中。长度小于等于40字节的 TEXT 和 BLOB 列存储在B+树页中。
若行的所有数据都能存放在索引页中,则 DYNAMIC 格式能够跟 COMPACT 和 REDUNDANT 格式保持一样的效率,可是 DYNAMIC 格式避免了长的列将大量字节数据填充到B+树节点中的问题。跟 COMPACT 格式将一部分数据存储在溢出页中相比,将过长列的数据彻底存放在溢出页中更高效。
对于页外存储,COMPRESSED 格式跟 DYNAMIC 相似,不一样的是,COMPRESSED 格式能够将表和索引的数据进行压缩。
相关阅读