Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  File-Per-Table Tablespaces

17.6.3.2 文件表空间

文件表空间包含单个InnoDB表的数据和索引,并将其存储在文件系统中的单个数据文件中。

文件表空间特性在本节下面的主题中进行描述:

文件表space配置

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;
File-Per-Table 表space Data Files

在一个.ibd数据文件中创建了一个File-Per-Table 表space。在MySQL数据目录下的schema目录下。该.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子句隐式创建一个File-Per-Table 表space数据文件,位于数据目录外。请参阅第17.6.1.2节,“外部创建表”

文件表space优点

文件表space相比于系统表space或公共表space,如下所示具有以下优点。

  • 在 truncating 或 dropping 文件表space中的一个表时,磁盘空间将被返回给操作系统。truncate 或 drop 一个存储在共享表space中的表只会在共享表space数据文件中创建自由空间,这些空间只能用于InnoDB数据。在其他字样,共享表space数据文件不会缩小大小后 truncate 或 drop 表。

  • ALTER TABLE操作在共享表space中的一个表上执行可能会增加表space所占用的磁盘空间。这些操作可能需要额外的空间,等于表数据加索引的总和。这部分空间不会像文件表space那样被返回给操作系统。

  • TRUNCATE TABLE性能在执行于文件表space中的表时更好。

  • 文件表space数据文件可以在独立的存储设备上创建,以优化I/O、空间管理或备份目的。见第17.6.1.2节,“外部创建表”

  • 您可以从另一个MySQL实例导入文件表space中的表。见第17.6.1.3节,“导入InnoDB表”

  • 文件表空间中的表支持与DYNAMICCOMPRESSED行格式相关的特性,这些特性不受系统表空间的支持。请参阅第17.10节,“InnoDB Row Formats”

  • 存储在单个表空间数据文件中的表可以在数据损坏、备份或二进制日志不可用、MySQL服务器实例无法重启时快速恢复时间和提高恢复成功的可能性。

  • 文件表空间中的表可以使用 MySQL Enterprise Backup 快速备份或恢复,不会中断其他InnoDB表的使用。这对具有不同备份计划或不需要频繁备份的表非常有利。请参阅Making a Partial Backup以获取详细信息。

  • 文件表空间允许通过监控表空间数据文件的大小来监控表的大小。

  • 常见的 Linux 文件系统不支持在innodb_flush_method设置为O_DIRECT时对单个文件(如共享表空间数据文件)的并发写入。因此,在使用文件表空间时,可能会出现性能改进。

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

文件表space 不良之处

相比于系统表space 或通用表space,文件表space 有以下不良之处。

  • 在文件表space 中,每个表可能都有未使用的空间,这些空间只能被同一个表中的行所利用,如果不正确地管理,这可能会导致空间浪费。

  • fsync 操作将对多个文件表space 数据文件进行,而不是单个共享表space 数据文件。由于fsync 操作是按文件进行的,写操作对于多个表不能被组合,这可能会导致总体的fsync 操作数量增加。

  • mysqld 必须保持每个文件表space 的打开文件句柄,这可能会影响性能,如果您有许多表在文件表space 中。

  • 对于每个表都有自己的数据文件,需要更多的文件描述符。

  • 存在更多的碎片化可能性,这可能会对DROP TABLE 和表扫描性能产生影响。但是,如果碎片化被正确地管理,文件表space 可以提高这些操作的性能。

  • 当从文件表space 中删除一个表时,缓冲池将被扫描,这可能会对大型缓冲池花费几秒钟。扫描使用广泛的内部锁定,这可能会延迟其他操作。

  • 变量innodb_autoextend_increment,定义了当自动扩展的共享表空间文件满时,用于扩展文件大小的增量大小。但是,这个变量不适用于文件-每-表表空间文件,因为这些文件无论innodb_autoextend_increment设置如何,都将自动扩展。初始文件-每-表表空间扩展为小额度,随后扩展将以4MB的增量进行。