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
.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子句隐式创建一个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表”。
-
文件表空间中的表支持与
DYNAMIC
和COMPRESSED
行格式相关的特性,这些特性不受系统表空间的支持。请参阅第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的增量进行。