15.6.3.2—独立表空间

一个独立表空间在文件系统中是一个独立的数据文件,其中包含一张InnoDB表中的数据和索引。

下面将从几个方面讲述独立表空间的特性:

独立表空间设置 #

InnoDB新建表时默认使用独立表空间。这可以通过变量innodb_file_per_table来控制。禁用innodb_file_per_table后,InnoDB会在系统表空间中创建表。

可以在配置文件中设置innodb_file_per_table,也可以在运行时通过 SET GLOBAL 语句来设置。在运行时修改这个设置需要相关权限。见章节5.1.9.1,“系统变量权限”

配置文件:

[mysqld]
innodb_file_per_table=ON

在运行时使用 SET GLOBAL:

mysql> SET GLOBAL innodb_file_per_table=ON;

独立表空间数据文件 #

创建独立表空间时,会在MySQL数据目录下相关数据库目录中创建一个.ibd后缀的数据文件。这个数据文件的名称就是表名。例如,表 test.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

你可以在CREATE TABLE语句后添加DATA DIRECTORY子句来明确指定独立表空间数据文件存储位置。要了解更多信息,请查阅15.6.1.2,“在外部创建表”

独立表空间的优势 #

和共享表空间(系统表空间或通用表空间)相比,独立表空间有以下优势:

  • 在清空或删除一张使用独立表空间的表后,磁盘空间会被返回给操作系统。清空或删除一张使用共享表空间的表会在表空间文件内部创建空闲空间,这部分空间只能被用于InnoDB数据。换句话说,清空或删除一张使用共享表空间的表,表空间文件大小不会减少。

  • 对一张位于共享表空间内的表使用表复制方式的ALTER TABLE操作,表空间占用的磁盘空间会增加。这类操作需要的额外空间大小是表数据和索引大小之和。 这不像独立表空间那样被释放并返回给操作系统。

  • 对使用独立表空间的表进行 truncate table操作性能会更好。

  • 可以在独立的存储设备上创建独立表空间文件,这有利于I/O优化,空间管理,或备份。见15.6.1.1,“在外部创建表”

  • 你可以从其它MySQL实例中导入表到独立表空间文件中。见章节15.1.6.3,“导入InnoDB表”

  • 使用独立表空间的表支持DYNAMIC和COMPRESSED行格式相关的特性,这在系统表空间中是不支持的。见15.10,“InnoDB行格式”

  • 在发生数据损坏,副本和binlog不可用时,或MySQL服务器无法重启时,使用独立表空间的表可以节省恢复时间,提高成功恢复的概率。

  • 可以使用MySQL企业版备份工具对使用独立表空间的表进行快速备份和恢复而不影响其它InnoDB表的使用。这对备份计划表不确定(或者说备份时间不确定更合适一些)或备份不频繁的表有好处。见部分备份

  • 可以通过监控独立表空间数据文件大小来监控相关表的大小。

  • 一般linux文件系统不允许并发写入同一个文件。使用共享表空间,且innodb_flush_method设置为O_DIRECT,会受到影响。因此,使用独立表空间可能会带来性能提升。

  • 共享表空间中的表收到表空间64TB最大上限的限制。与之相比,每一个独立表空间文件最大值都是64TB,这为每张表提供了充足的空间。

独立表空间的缺陷 #

和共享表空间相比,独立表空间也有一些缺点:

  • 对于独立表空间来说,每一张表都可能有未使用的空间,而这部分空间只能由这一张表使用。如果管理不当,这可能会到空间浪费。
  • 使用独立表空间,fsync操作要在多个独立表空间文件上执行,而不像共享表空间那样只在一个文件上执行。因为每个文件上要独立执行fsync,对多张表的写操作不能合并,这可能会导致fsync操作数量过高。
  • mysqld必须对每一张使用独立表空间的表都维护一个打开的文件句柄,如果表的数量过多,这可能会影响性能。
  • 如果每一张表都有自己的数据文件,会需要更多的文件描述符。
  • 可能会带来磁盘碎片,这可能会成为影响DROP TABLE和扫描表的性能的潜在因素。但是,如果碎片管理得当,则可以提高这些操作的性能。
  • 在删除一张使用独立表空间的表时,会扫描InnoDB的buffer pool,如果buffer pool很大,这可能会花费数秒。这个扫描操作会使用一个内部锁,这可能会影响其它操作。
  • 定义共享表空间文件变满时自动增长的增长量的变量innodb_autoextend_increment,不适用于独立表空间文件。独立表空间文件自动增长时不受这个变量的影响。独立表空间文件增长时的增长量很小,每次增长4MB。