InnoDB表的數據文件格式及行格式簡介

InnoDB的數據文件格式(File-Format)

在早期的InnoDB版本中,因爲文件格式只有一種,所以不須要爲此文件格式命名。隨着InnoDB引擎的發展,開發出了不兼容早期版本的新文件格式,用於支持新的功能。爲了在升級和降級狀況下幫助管理系統的兼容性,以及運行不一樣的MySQL版本,InnoDB開始使用命名的文件格式。html

目前,InnoDB只支持兩種文件格式:Antelope 和 Barracuda。mysql

  • Antelope: 先前未命名的,原始的InnoDB文件格式。它支持兩種行格式:COMPACT 和 REDUNDANT。MySQL5.6的默認文件格式。能夠與早期的版本保持最大的兼容性。不支持 Barracuda 文件格式。
  • Barracuda: 新的文件格式。它支持InnoDB的全部行格式,包括新的行格式:COMPRESSED 和 DYNAMIC。與這兩個新的行格式相關的功能包括:InnoDB表的壓縮,長列數據的頁外存儲和索引建前綴最大長度爲3072字節(innodb_large_prefix)。

啓用文件格式

innodb_file_format 配置能夠啓用InnoDB文件格式。默認值爲Antelope。sql

有三種方式能夠修改 innodb_file_format 參數的值:命令行

  • 在命令行啓動mysqld的時候
  • 在my.cnf文件中
  • 經過 SET GLOBAL 語句動態修改
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

  • 經過 SHOW TABLE STATUS 命令
  • 經過 InnoDB INFORMATION_SCHEMA 查看指定的表或表空間的文件格式
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表的行格式

接下來介紹這些行格式支持的功能,以及如何選擇正確的行格式。索引

InnoDB行存儲概述

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, DYNAMICCOMPRESSED。對於InnoDB表,默認的行格式爲:COMPACT。

InnoDB表中行的物理結構由行格式決定。更多信息查看:Physical Row Structure of InnoDB Tables

COMPACT 和 REDUNDANT 行格式

對於 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。

DYNAMIC 和 COMPRESSED 行格式

要想使用這兩種文件格式,變量 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 格式能夠將表和索引的數據進行壓縮。

相關閱讀

相關文章
相關標籤/搜索