14.6.3.2 每 table 文件 table 空间

每 table 文件 table 空间包含单个InnoDBtable 的数据和索引,并存储在文件系统中自己的数据文件中。

每节文件 table 空间 Feature 在本节的以下主题下描述:

每 table 文件 table 空间配置

InnoDB默认情况下在每个 table 文件 table 空间中创建 table。此行为由innodb_file_per_table变量控制。禁用innodb_file_per_table会导致InnoDB在系统 table 空间中创建 table。

innodb_file_per_table设置可以在选项文件中指定,也可以在运行时使用SET GLOBAL语句进行配置。在运行时更改设置需要足够的特权来设置全局系统变量。参见第 5.1.8.1 节“系统变量特权”

Option file:

[mysqld]
innodb_file_per_table=ON

在运行时使用SET GLOBAL

mysql> SET GLOBAL innodb_file_per_table=ON;

默认情况下,在 MySQL 5.6 及更高版本中启用innodb_file_per_table。如果需要考虑与 MySQL 早期版本的向后兼容性,则可以考虑禁用它。

Warning

禁用innodb_file_per_table可以防止 table 复制ALTER TABLE操作将驻留在系统 table 空间中的 table 隐式移动到每个 table 文件 table 空间中。复制 tableALTER TABLE的操作使用当前innodb_file_per_table设置重新创建 table。当添加或删除二级索引时,此行为不适用,也不适用于使用INPLACE算法的ALTER TABLE操作,或者不适用于使用创建 table...table 空间更改 table...table 空间语法添加到系统 table 空间的 table。

每 table 文件 table 空间数据文件

在 MySQL 数据目录下的架构目录中的.idb数据文件中,创建了每 table 文件 table 空间。 .ibd文件是为 table 命名的(table_name.ibd)。例如,tabletest.t1的数据文件是在 MySQL 数据目录下的test目录中创建的:

mysql> USE test;

mysql> CREATE TABLE t1 (
   id INT PRIMARY KEY AUTO_INCREMENT,
   name VARCHAR(100)
 ) ENGINE = InnoDB;

shell> cd /path/to/mysql/data/test
shell> ls
t1.ibd

您可以使用CREATE TABLE语句的DATA DIRECTORY子句在数据目录外部隐式创建每 table 文件 table 空间数据文件。有关更多信息,请参见第 14.6.1.2 节“在外部创建 table”

每 table 文件 table 空间的优势

每 table 文件 table 空间与共享 table 空间(例如系统 table 空间或常规 table 空间)相比具有以下优点。

  • 截断或删除每个 table 文件 table 空间中创建的 table 后,磁盘空间将返回 os。截断或删除存储在共享 table 空间中的 table 会在共享 table 空间数据文件中创建可用空间,该可用空间仅可用于InnoDB数据。换句话说,在 table 被截断或删除后,共享 table 空间数据文件的大小不会缩小。

  • 对驻留在共享 table 空间中的 table 进行 table 复制ALTER TABLE操作可以增加 table 空间占用的磁盘空间量。此类操作可能需要与 table 中的数据加索引一样多的额外空间。该空间不会像每个 table 文件 table 空间那样释放回 os。

  • 在每个 table 文件 table 空间中的 table 上执行时,TRUNCATE TABLE性能更好。

  • 可以在单独的存储设备上创建每 table 文件 table 空间数据文件,以进行 I/O 优化,空间 Management 或备份。参见第 14.6.1.2 节“在外部创建 table”

  • 您可以从另一个 MySQL 实例导入一个位于每 table 文件 table 空间中的 table。参见第 14.6.1.3 节“导入 InnoDBtable”

  • 在每 table 文件 table 空间中创建的 table 使用梭子鱼文件格式。参见第 14.10 节“ InnoDB 文件格式 Management”。梭子鱼文件格式启用与DYNAMICCOMPRESSED行格式关联的功能。参见第 14.11 节“ InnoDB 行格式”

  • 当发生数据损坏,备份或二进制日志不可用或无法重新启动 MySQL 服务器实例时,存储在单个 table 空间数据文件中的 table 可以节省时间并提高成功恢复的机会。

  • 您可以使用 MySQL Enterprise Backup 快速备份或还原在每 table 文件 table 空间中创建的 table,而不会中断其他InnoDBtable 的使用。这对于具有不同备份计划的 table 或需要较少备份的 table 很有用。有关详情,请参见进行部分备份

  • 每 table 文件 table 空间允许通过监视 table 空间数据文件的大小来监视文件系统上的 table 大小。

  • innodb_flush_method设置为O_DIRECT时,常见的 Linux 文件系统不允许并发写入单个文件,例如共享 table 空间数据文件。结果,当结合使用每 table 文件 table 空间和该设置时,可能会提高性能。

  • 共享 table 空间中的 table 的大小受到 64TBtable 空间大小限制的限制。相比之下,每个 table 的每个文件 table 空间都有 64TB 的大小限制,这为单个 table 的大小增加提供了足够的空间。

每 table 文件 table 空间的缺点

与共享 table 空间(例如系统 table 空间或常规 table 空间)相比,每 table 文件 table 空间具有以下缺点。

  • 使用每 table 文件 table 空间,每个 table 可能有未使用的空间,只能由同一 table 的行使用,如果 Management 不当,则会浪费空间。

  • fsync操作是针对每个 table 的多个文件而不是单个共享 table 空间的数据文件执行的。由于fsync个操作是针对每个文件的,因此无法合并多个 table 的写操作,这可能导致fsync个操作的总数更高。

  • mysqld必须为每个 table 每文件 table 空间保留一个打开的文件句柄,如果每个 table 文件 table 空间中有许多 table,则这可能会影响性能。

  • 每个 table 都有其自己的数据文件时,需要更多的文件 Descriptors。

  • 可能存在更多碎片,这可能会阻碍DROP TABLE和 table 扫描性能。但是,如果 Management 碎片,则每 table 文件 table 空间可以提高这些操作的性能。

  • 删除驻留在每个 table 文件 table 空间中的 table 时,将扫描缓冲池,对于大型缓冲池可能要花费几秒钟。使用广泛的内部锁定执行扫描,这可能会延迟其他操作。

  • innodb_autoextend_increment变量定义用于在自动扩展共享 table 空间文件变满时扩展其大小的增量大小,该变量不适用于每 table 文件的 table 空间文件,无论innodb_autoextend_increment设置如何,该文件都将自动扩展。每个 table 的初始文件 tableextensions 很少,之后 extensions 以 4MB 为增量。