在早期的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 格式能夠將表和索引的數據進行壓縮。
相關閱讀