1. InnoDB 文件存儲結構
一個
ibd
數(shù)據(jù)文件 ->Segment
(段)->Extent
(區(qū))->Page
(頁)->Row
(行)
- Tablesapce
表空間:一個文件包含多個段表空間,用于存儲多個ibd
數(shù)據(jù)文件,用于存儲表的記錄和索引呈础。一個文件包含多個段据途。 - Segment
段:用于管理多個Extent
,分為數(shù)據(jù)段(Leaf node segment
)抵屿、索引段(Non-leaf node segment
)疹尾、回滾段(Rollback segment
)昙篙。一個表至少會有兩個segment
秘豹,一個管理數(shù)據(jù)携御,一個管理索引。每多創(chuàng)建一個索引既绕,會多兩個segment
啄刹。 - Extent
區(qū):一個區(qū)固定包含64
個連續(xù)的頁,大小為1M
凄贩。當表空間不足鸵膏,需要分配新的頁資源,不會一頁一頁分怎炊,直接分配一個區(qū)。 - Page
頁:用于存儲多個Row
行記錄廓译,大小為16K
评肆。包含很多種頁類型,比如數(shù)據(jù)頁非区,undo
頁瓜挽,系統(tǒng)頁,事務數(shù)據(jù)頁征绸,大的BLOB
對象頁久橙。 - Row
行:包含了記錄的字段值,事務ID
(Trx id
)管怠、滾動指針(Roll pointer
)淆衷、字段指針(Field pointers
)等信息
說明:Page
是文件最基本的單位,無論何種類型的 page
渤弛,都是由page header
祝拯,page trailer
和 page body
組成。如下圖所示
2. InnoDB 文件存儲格式
- 通過
SHOW TABLE STATUS
命令
SHOW TABLE STATUS
一般情況下她肯,如果
row_format
為REDUNDANT
佳头、COMPACT
,文件格式為 Antelope
晴氨;如果 row_format
為 DYNAMIC
和COMPRESSED
康嘉,文件格式為 Barracuda
。
- 通過 information_schema 查看指定表的文件格式
select * from information_schema.innodb_sys_tables;
2.1 File文件格式(File-Format)
在早期的 InnoDB
版本中籽前,文件格式只有一種亭珍,隨著 InnoDB
引擎的發(fā)展敷钾,出現(xiàn)了新文件格式,用于支持新的功能块蚌。目前 InnoDB
只支持兩種文件格式:Antelope
和 Barracuda
闰非。
-
Antelope
: 先前未命名的,最原始的InnoDB
文件格式峭范,它支持兩種行格式:COMPACT
和REDUNDANT
财松,MySQL 5.6
及其以前版本默認格式為Antelope
。 -
Barracuda
: 新的文件格式纱控。它支持InnoDB
的所有行格式辆毡,包括新的行格式:COMPRESSED
和DYNAMIC
。
通過 innodb_file_format
配置參數(shù)可以設置 InnoDB
文件格式甜害,之前默認值為 Antelope
舶掖,5.7
版本開始改為 Barracuda
。
2.2 Row行格式(Row_format)
表的行格式?jīng)Q定了它的行是如何物理存儲的尔店,這反過來又會影響查詢和DML
操作的性能眨攘。如果在單個 page
頁中容納更多行,查詢和索引查找可以更快地工作嚣州,緩沖池中所需的內(nèi)存更少鲫售,寫入更新時所需的 I/O
更少。
InnoDB
存儲引擎支持四種行格式:REDUNDANT
该肴、COMPACT
情竹、DYNAMIC
和COMPRESSED
。
DYNAMIC
和 COMPRESSED
新格式引入的功能有:數(shù)據(jù)壓縮匀哄、增強型長列數(shù)據(jù)的頁外存儲和大索引前綴秦效。
每個表的數(shù)據(jù)分成若干頁來存儲,每個頁中采用 B
樹結構存儲涎嚼;
如果某些字段信息過長阱州,無法存儲在B
樹節(jié)點中,這時候會被單獨分配空間法梯,此時被稱為溢出頁贡耽,該字段被稱為頁外列。
REDUNDANT
行格式
使用REDUNDANT
行格式鹊汛,表會將變長列值的前768
字節(jié)存儲在B
樹節(jié)點的索引記錄中蒲赂,其余的存儲在溢出頁上。對于大于等于786
字節(jié)的固定長度字段刁憋,InnoDB
會轉換為變長字段滥嘴,以便能夠在頁外存儲。COMPACT
行格式
與REDUNDANT
行格式相比至耻,COMPACT
行格式減少了約20%
的行存儲空間若皱,但代價是增加了某些操作的CPU
使用量镊叁。如果系統(tǒng)負載是受緩存命中率和磁盤速度限制,那么COMPACT
格式可能更快走触。如果系統(tǒng)負載受到CPU
速度的限制晦譬,那么COMPACT
格式可能會慢一些。DYNAMIC
行格式
使用DYNAMIC
行格式互广,InnoDB
會將表中可變長度的列值完全存儲在頁外敛腌,而索引記錄只包含指向溢出頁的20
字節(jié)指針。大于或等于768
字節(jié)的固定長度字段編碼為可變長度字段惫皱。DYNAMIC
行格式支持大索引前綴像樊,最多可以為3072
字節(jié),可通過innodb_large_prefix
參數(shù)控制旅敷。COMPRESSED
行格式
COMPRESSED
行格式提供與DYNAMIC
行格式相同的存儲特性和功能生棍,但增加了對表和索引數(shù)據(jù)壓縮的支持。
在創(chuàng)建表和索引時媳谁,文件格式都被用于每個 InnoDB
表數(shù)據(jù)文件(其名稱與 *.ibd
匹配)涂滴。修改文件格式的方法是重新創(chuàng)建表及其索引,最簡單方法是對要修改的每個表使用以下命令:
ALTER TABLE 表名 ROW_FORMAT = 格式類型;