每個表格表空間包含單一 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
檔案會以表格命名(
)。例如,表格 table_name
.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 節「外部建立表格」。
與共用表格空間 (例如系統表格空間或一般表格空間) 相比,每個表格一個檔案的表格空間具有以下優點。
在每個表格一個檔案的表格空間中建立的表格被截斷或捨棄後,磁碟空間會返回給作業系統。在共用表格空間中儲存的表格被截斷或捨棄後,會在共用表格空間資料檔中產生可用空間,該空間只能用於
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 的增量發生。