文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信件) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.11.2 檔案空間管理

您使用 innodb_data_file_path 設定選項在設定檔中定義的資料檔案構成 InnoDB 系統表格空間。這些檔案會以邏輯方式串連以構成系統表格空間。沒有使用條帶化。您無法定義表格在系統表格空間內的配置位置。在新建的系統表格空間中,InnoDB 會從第一個資料檔案開始配置空間。

為避免將所有表格和索引儲存在系統表格空間內所帶來的問題,您可以啟用 innodb_file_per_table 設定選項(預設值),該選項會將每個新建表格儲存在個別的表格空間檔案中(副檔名為 .ibd)。對於以此方式儲存的表格,磁碟檔案內的碎片較少,且在截斷表格時,空間會返回到作業系統,而不是仍然由 InnoDB 在系統表格空間內保留。如需更多資訊,請參閱第 17.6.3.2 節「每個表格的表格空間」

您也可以將表格儲存在一般表格空間中。一般表格空間是使用 CREATE TABLESPACE 語法建立的共用表格空間。它們可以在 MySQL 資料目錄之外建立、能夠容納多個表格,並支援所有列格式的表格。如需更多資訊,請參閱第 17.6.3.3 節「一般表格空間」

頁面、範圍、區段和表格空間

每個表空間都由資料庫頁面組成。在一個 MySQL 實例中,每個表空間都具有相同的頁面大小。預設情況下,所有表空間的頁面大小為 16KB;您可以在建立 MySQL 實例時,透過指定 innodb_page_size 選項,將頁面大小縮減為 8KB 或 4KB。您也可以將頁面大小增加至 32KB 或 64KB。如需更多資訊,請參閱 innodb_page_size 文件。

這些頁面會被分組為大小為 1MB 的區塊,適用於最大 16KB 的頁面(連續 64 個 16KB 頁面,或 128 個 8KB 頁面,或 256 個 4KB 頁面)。若頁面大小為 32KB,區塊大小則為 2MB。若頁面大小為 64KB,區塊大小則為 4MB。表空間內的檔案InnoDB 中稱為區段。(這些區段與回滾區段不同,後者實際上包含許多表空間區段。)

當區段在表空間內成長時,InnoDB 會先一次分配 32 個頁面給它。之後,InnoDB 開始分配整個區塊給該區段。InnoDB 一次最多可以為大型區段添加 4 個區塊,以確保資料具有良好的循序性。

InnoDB 中,每個索引都會分配兩個區段。一個用於 B 樹的非葉節點,另一個用於葉節點。將葉節點在磁碟上保持連續可以實現更好的循序 I/O 操作,因為這些葉節點包含實際的表格資料。

表空間中的某些頁面包含其他頁面的位元圖,因此 InnoDB 表空間中的一些區塊無法以整體方式分配給區段,而只能以個別頁面的方式分配。

當您透過發出 SHOW TABLE STATUS 陳述式要求表空間中的可用可用空間時,InnoDB 會回報表空間中確定為空閒的區塊。InnoDB 總是會保留一些區塊以用於清理和其他內部用途;這些保留的區塊不包含在可用空間中。

當您從表格中刪除資料時,InnoDB 會縮減對應的 B 樹索引。釋放的空間是否可供其他使用者使用,取決於刪除模式是否會將個別頁面或區塊釋放回表空間。捨棄表格或刪除表格中的所有資料列保證將空間釋放給其他使用者,但請記住,刪除的資料列僅會在清除操作之後才會實際移除,該操作會在它們不再需要用於交易回滾或一致性讀取後的某個時間自動發生。(請參閱第 17.3 節「InnoDB 多版本控制」。)

設定保留檔案區段頁面的百分比

innodb_segment_reserve_factor 變數允許定義保留為空白頁面的表空間檔案區段頁面百分比。會保留一定百分比的頁面以供未來成長,以便 B 樹中的頁面可以連續分配。修改保留頁面百分比的能力允許微調 InnoDB,以解決資料片段化或儲存空間使用效率低下的問題。

此設定適用於每個表格的檔案和一般表空間。innodb_segment_reserve_factor 的預設設定為 12.5%。

innodb_segment_reserve_factor 變數是動態的,可以使用 SET 陳述式進行設定。例如

mysql> SET GLOBAL innodb_segment_reserve_factor=10;

頁面如何與表格資料列相關

對於 4KB、8KB、16KB 和 32KB 的 innodb_page_size 設定,最大資料列長度略小於資料庫頁面大小的一半。例如,對於預設的 16KB InnoDB 頁面大小,最大資料列長度略小於 8KB。對於 64KB 的 innodb_page_size 設定,最大資料列長度略小於 16KB。

如果資料列未超過最大資料列長度,則所有資料會在本機儲存在頁面中。如果資料列超過最大資料列長度,則會選擇變數長度欄進行外部頁外儲存,直到資料列符合最大資料列長度限制。變數長度欄的外部頁外儲存方式因資料列格式而異。

  • COMPACT 和 REDUNDANT 資料列格式

    當選擇變數長度欄進行外部頁外儲存時,InnoDB 會在本機將前 768 個位元組儲存在資料列中,其餘部分則會外部儲存在溢位頁面中。每個這樣的欄都有自己的溢位頁面清單。768 位元組的前綴會伴隨著一個 20 位元組的值,該值會儲存欄的真實長度,並指向儲存值其餘部分的溢位清單。請參閱第 17.10 節「InnoDB 資料列格式」

  • DYNAMIC 和 COMPRESSED 資料列格式

    當選擇變數長度欄進行外部頁外儲存時,InnoDB 會在本機將一個 20 位元組的指標儲存在資料列中,其餘部分則會外部儲存在溢位頁面中。請參閱第 17.10 節「InnoDB 資料列格式」

LONGBLOBLONGTEXT 欄的大小必須小於 4GB,且包含 BLOBTEXT 欄在內的資料列總長度必須小於 4GB。