每个表的表空间包含单个 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
.ibdtest.t1
的数据文件在 MySQL 数据目录下的 test
目录中创建:
mysql> USE test;
mysql> CREATE TABLE t1 (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
) ENGINE = InnoDB;
$> cd /path/to/mysql/data/test
$> ls
t1.ibd
可以使用 DATA DIRECTORY
子句的 CREATE TABLE
语句隐式创建一个外部的每个表的表空间数据文件。有关更多信息,请参阅 第 17.6.1.2 节,“外部创建表”。
每个表的表空间相比共享表空间(如系统表空间或通用表空间)具有以下优势。
-
在每个表的表空间中截断或删除表后,磁盘空间将被返回给操作系统。在共享表空间中截断或删除表只会在共享表空间数据文件中创建空闲空间,该空间只能用于
InnoDB
数据。换言之,共享表空间数据文件不会在截断或删除表后缩小。 -
在共享表空间中执行表复制
ALTER TABLE
操作可能会增加表空间占用的磁盘空间。这些操作可能需要与表数据和索引一样多的额外空间,该空间不会被返回给操作系统,而是保留在共享表空间中。 -
TRUNCATE TABLE
在每个表的表空间中的性能更好。 -
每个表的表空间数据文件可以在单独的存储设备上创建,以便进行I/O优化、空间管理或备份目的。见第17.6.1.2节,“在外部创建表”。
-
您可以从另一个MySQL实例导入驻留在文件每个表表空间中的表。见第17.6.1.3节,“导入InnoDB表”。
-
在文件每个表表空间中创建的表支持与
DYNAMIC
和COMPRESSED
行格式相关的功能,这些功能不受系统表空间支持。见第17.10节,“InnoDB行格式”。 -
存储在单个表空间数据文件中的表可以在数据损坏、备份或二进制日志不可用或MySQL服务器实例无法重新启动时节省时间,并提高恢复成功的机会。
-
在文件每个表表空间中创建的表可以使用MySQL Enterprise Backup快速备份或恢复,而不中断其他
InnoDB
表的使用。这对具有不同备份计划或需要备份频率较低的表非常有益。见执行部分备份以获取详细信息。 -
文件每个表表空间允许通过监控表空间数据文件的大小来监控表的大小。
-
常见的Linux文件系统不允许对共享表空间数据文件进行并发写入,当
innodb_flush_method
设置为O_DIRECT
时。这可能会在使用文件每个表表空间时提高性能。 -
在共享表空间中的表的大小受到64TB表空间大小限制的限制。相比之下,每个文件每个表表空间都有64TB的大小限制,为单个表提供了足够的增长空间。
文件每个表表空间相比共享表空间(如系统表空间或通用表空间)具有以下缺点。
-
使用文件每个表表空间时,每个表可能会有未使用的空间,这些空间只能被同一表的行使用,从而导致空间浪费,如果不进行适当的管理。
-
fsync
操作是在多个文件每个表数据文件上执行的,而不是在单个共享表空间数据文件上。因为fsync
操作是按文件执行的,因此无法将多个表的写操作组合起来,从而可能导致总的fsync
操作次数增加。 -
mysqld必须为每个文件每个表表空间保持打开的文件句柄,这可能会对性能产生影响,如果您有许多表在文件每个表表空间中。
-
需要更多的文件描述符,因为每个表都有其自己的数据文件。
-
可能会出现更多的碎片化,从而影响
DROP TABLE
和表扫描性能。然而,如果碎片化得到管理,文件每个表表空间可以提高这些操作的性能。 -
在删除驻留在文件每个表表空间中的表时,需要扫描缓冲池,这可能需要几秒钟的时间,对于大型缓冲池来说。扫描是使用广泛的内部锁进行的,这可能会延迟其他操作。
-
变量
innodb_autoextend_increment
,它定义了自动扩展共享表空间文件的增量大小,当文件变满时,不适用于文件每个表表空间文件,这些文件无论innodb_autoextend_increment
设置如何都是自动扩展的。初始文件每个表表空间扩展是以小增量进行的,然后扩展以4MB的增量进行。