每個資料表單獨的表空間包含單一 InnoDB
資料表的資料與索引,並以單一資料檔案的形式儲存在檔案系統中。
本節將在以下主題中說明每個資料表單獨的表空間特性
InnoDB
預設會在每個資料表單獨的表空間中建立資料表。此行為由 innodb_file_per_table
變數控制。停用 innodb_file_per_table
會導致 InnoDB
在系統表空間中建立資料表。
可以在選項檔案中指定 innodb_file_per_table
設定,或使用 SET GLOBAL
陳述式在執行階段設定。在執行階段變更設定需要足夠的權限來設定全域系統變數。請參閱 第 7.1.9.1 節,「系統變數權限」。
選項檔案
[mysqld]
innodb_file_per_table=ON
在執行階段使用 SET GLOBAL
mysql> SET GLOBAL innodb_file_per_table=ON;
每個資料表單獨的表空間會在 MySQL 資料目錄下的綱要目錄中,以 .ibd
資料檔案的形式建立。 .ibd
檔案的名稱是資料表 (
)。例如,資料表 資料表名稱
.ibdtest.t1
的資料檔案會在 MySQL 資料目錄下的 test
目錄中建立
mysql> USE test;
mysql> CREATE TABLE t1 (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(100)
-> ) ENGINE = InnoDB;
mysql> EXIT;
$> cd /path/to/mysql/data/test
$> ls
t1.ibd
您可以使用 CREATE TABLE
陳述式的 DATA DIRECTORY
子句,以在資料目錄外部隱式建立每個資料表單獨的表空間資料檔案。如需詳細資訊,請參閱 第 17.6.1.2 節,「在外部建立資料表」。
相較於系統表空間或通用表空間等共享表空間,單獨檔案式表空間具有以下優點。
在單獨檔案式表空間中建立的資料表,在截斷 (truncate) 或刪除 (drop) 後,磁碟空間會歸還給作業系統。在共享表空間中儲存的資料表,截斷或刪除後會在共享表空間資料檔案中產生可用空間,但這些空間只能用於
InnoDB
資料。換句話說,共享表空間資料檔案在資料表被截斷或刪除後不會縮減大小。對位於共享表空間的資料表執行資料表複製的
ALTER TABLE
操作可能會增加表空間所佔用的磁碟空間。這類操作可能需要與資料表中的資料加上索引一樣多的額外空間。這些空間不會像單獨檔案式表空間一樣釋放回作業系統。當對位於單獨檔案式表空間的資料表執行
TRUNCATE TABLE
時,效能會更好。單獨檔案式表空間資料檔案可以建立在不同的儲存裝置上,以達到 I/O 優化、空間管理或備份的目的。請參閱 第 17.6.1.2 節,「外部建立資料表」。
您可以從另一個 MySQL 實例匯入位於單獨檔案式表空間中的資料表。請參閱 第 17.6.1.3 節,「匯入 InnoDB 資料表」。
在單獨檔案式表空間中建立的資料表支援與
DYNAMIC
和COMPRESSED
列格式相關的功能,這些功能系統表空間不支援。請參閱 第 17.10 節,「InnoDB 列格式」。當發生資料損毀、備份或二進位日誌不可用,或 MySQL 伺服器實例無法重新啟動時,儲存在個別表空間資料檔案中的資料表可以節省時間,並提高成功復原的機會。
使用 MySQL Enterprise Backup,可以快速備份或還原在單獨檔案式表空間中建立的資料表,而不會中斷其他
InnoDB
資料表的使用。這對於具有不同備份排程或需要較少備份頻率的資料表很有幫助。有關詳細資訊,請參閱製作部分備份。單獨檔案式表空間允許透過監控表空間資料檔案的大小,來監控檔案系統上的資料表大小。
當
innodb_flush_method
設定為O_DIRECT
時,常見的 Linux 檔案系統不允許同時寫入單一檔案 (例如共享表空間資料檔案)。因此,將單獨檔案式表空間與此設定一起使用時,可能會提高效能。共享表空間中的資料表大小受限於 64TB 的表空間大小限制。相比之下,每個單獨檔案式表空間都有 64TB 的大小限制,這為個別資料表的大小增長提供了充足的空間。
相較於系統表空間或通用表空間等共享表空間,單獨檔案式表空間具有以下缺點。
使用單獨檔案式表空間時,每個資料表可能都有未使用的空間,這些空間只能由同一個資料表的列使用,如果管理不當,可能會導致空間浪費。
fsync
操作是在多個單獨檔案式資料檔案上執行,而不是在單一共享表空間資料檔案上執行。由於fsync
操作是針對每個檔案,因此無法合併多個資料表的寫入操作,這可能會導致更高的fsync
操作總數。mysqld 必須為每個單獨檔案式表空間保持開啟的檔案控制代碼,如果您的單獨檔案式表空間中有大量資料表,可能會影響效能。
當每個資料表都有自己的資料檔案時,需要更多的檔案描述符。
可能會有更多的碎片,這會阻礙
DROP TABLE
和資料表掃描效能。但是,如果碎片得到管理,單獨檔案式表空間可以提高這些操作的效能。在刪除位於單獨檔案式表空間中的資料表時,會掃描緩衝池,對於大型緩衝池,這可能需要幾秒鐘的時間。掃描是在廣泛的內部鎖定下執行,這可能會延遲其他操作。
innodb_autoextend_increment
變數定義自動擴展的共享表空間檔案在填滿時,其擴展的大小增量,但不適用於單獨檔案式表空間檔案,無論innodb_autoextend_increment
設定如何,單獨檔案式表空間檔案都會自動擴展。單獨檔案式表空間的初始擴展量很小,之後的擴展量會以 4MB 的增量發生。