每表文件表空间
每表文件表空间包含单个InnoDB
表的数据和索引,并存储在文件系统中自己的数据文件中。
每节文件表空间特征在本节的以下主题下描述:
- 每表文件表空间配置
- 每表文件表空间数据文件
- 每表文件表空间的优势
- 每表文件表空间的缺点
每表文件表空间配置
InnoDB
默认情况下,在每个表文件表空间中创建表。此行为由innodb_file_per_table
变量控制。禁用在系统表空间中创建表的innodb_file_per_table
原因InnoDB
。
innodb_file_per_table
设置可以在选项文件来指定,或者使用在运行时配置的SET GLOBAL
语句。在运行时更改设置需要足够的特权来设置全局系统变量。请参见“系统变量特权”。
选项文件:
[mysqld] innodb_file_per_table=ON
SET GLOBAL
在运行时使用:
mysql>SET GLOBAL innodb_file_per_table=ON ;
每表文件表空间数据文件
.idb
在MySQL数据目录下的架构目录中的数据文件中,将创建一个每表文件表空间。该.ibd
文件以表(table_name.ibd
)命名。例如,在MySQL数据目录下的目录中test.t1
创建表的数据文件test
:
mysql>USE test; mysql>CREATE TABLE t1 ( id INTPRIMARY KEY AUTO_INCREMENT ,name VARCHAR(100) )ENGINE = InnoDB; shell> cd /path/to/mysql/data /test shell> ls t1.ibd
您可以使用该语句的DATA DIRECTORY
子句CREATE TABLE
在数据目录外部隐式创建一个每表文件表空间数据文件。有关更多信息,请参见“在外部创建表”。
每表文件表空间的优势
与共享表空间(例如系统表空间或常规表空间)相比,每表文件表空间具有以下优点。
- 截断或删除每个表文件表空间中创建的表后,磁盘空间将返回操作系统。截断或删除存储在共享表空间中的表会在共享表空间数据文件中创建可用空间,该可用空间仅可用于
InnoDB
数据。换句话说,在表被截断或删除后,共享表空间数据文件的大小不会缩小。 ALTER TABLE
对驻留在共享表空间中的表进行表复制操作会增加表空间占用的磁盘空间量。此类操作可能需要与表中的数据以及索引一样多的额外空间。该空间不会像每个表文件表空间那样释放回操作系统。TRUNCATE TABLE
在每个表文件表空间中的表上执行时,性能会更好。- 可以在单独的存储设备上创建每表文件表空间数据文件,以进行I / O优化,空间管理或备份。请参见“在外部创建表”。
- 您可以从另一个MySQL实例导入每个表文件表空间中的表。请参见“导入InnoDB表”。
- 在每表文件表空间中创建的表支持与
DYNAMIC
和COMPRESSED
格式相关的功能,系统表空间不支持这些功能。请参见“ 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为增量。