14.6.3.2 每 table 文件 table 空间
每 table 文件 table 空间包含单个InnoDB
table 的数据和索引,并存储在文件系统中自己的数据文件中。
每节文件 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”。梭子鱼文件格式启用与
DYNAMIC
和COMPRESSED
行格式关联的功能。参见第 14.11 节“ InnoDB 行格式”。 -
当发生数据损坏,备份或二进制日志不可用或无法重新启动 MySQL 服务器实例时,存储在单个 table 空间数据文件中的 table 可以节省时间并提高成功恢复的机会。
-
您可以使用 MySQL Enterprise Backup 快速备份或还原在每 table 文件 table 空间中创建的 table,而不会中断其他
InnoDB
table 的使用。这对于具有不同备份计划的 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 为增量。