文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
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 開始為區段分配整個範圍 (extent)。InnoDB 可以一次為大型區段新增最多 4 個範圍,以確保資料具有良好的連續性。

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

表格空間中的某些頁面包含其他頁面的點陣圖,因此 InnoDB 表格空間中的一些範圍不能作為整體分配給區段,而只能作為單獨的頁面分配。

當您發出 SHOW TABLE STATUS 語句請求表格空間中的可用空間時,InnoDB 會報告表格空間中確定為空閒的範圍。InnoDB 總是會保留一些範圍用於清理和其他內部用途;這些保留的範圍不包含在可用空間中。

當您從表格中刪除資料時,InnoDB 會收縮相應的 B 樹索引。釋放的空間是否可供其他使用者使用,取決於刪除模式是將單個頁面還是範圍釋放回表格空間。刪除表格或刪除其中的所有列保證會將空間釋放給其他使用者,但請記住,只有在不再需要它們進行交易回滾或一致性讀取之後,才會由 清除 (purge) 操作自動物理移除已刪除的列。(請參閱 第 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。