每个表的文件表空间包含单个 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 的增量进行扩展。