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