文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  每个表的文件表空间

17.6.3.2 每个表的文件表空间

每个表的文件表空间包含单个 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.ibd)。例如,表 test.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 表”

  • 在每个表的文件表空间中创建的表支持与 DYNAMICCOMPRESSED 行格式相关的功能,而系统表空间不支持这些功能。请参阅 第 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 的增量进行扩展。