MySQL InnoDB Tablespaces

Tablespaces

近期在工作的过程中接触到MySQL表空间的概念,MySQL5.7之后,支持三种表空间:file-per-table tablespaces、general tablespaces、system tablespaces。分别为单表空间、通用表空间、系统表空间。说白了就是表的存储形式,单表空间是每个表一个文件,通用表空间是可选择的将部分表放在一个表空间集中管理,系统表空间是将所有的表放在一个表空间。

以下是官方手册对通用表空间的解释:

通用表空间

共享的InnoDB表空间使用CREATE TABLESPACE语法创建。通用表空间可以创建在MySQL data目录之外,并且可以持有多张表,支持所有的行格式。

将表添加到通用表空间使用的语法:

CREATE TABLE tb_name ... TABLESPACE [=] tablespace_name 
-- 或者
ALTER TABLE tb_name TABLESPACE [=] tablespace_name

InnoDB通用表空间

通用表空间是InnoDB表空间的新类型,MySQL5.7引入。通用表空间提供以下功能:

  • 与系统表空间类似,通用表空间共享表空间,可以存储多张表的数据。

  • 通用表空间比单表空间(file-per-table tablespaces)有潜在的内存优势。在表空间的生命周期内,服务保持表空间的元数据在内存中。对于元数据,多张表在更小的通用表空间中消耗更少的内存比相同数量的表在分离的单表空间。

  • 通用表空间可以放置在一个相对或者独立于MySQL data目录的目录内。MySQL data目录提供给你许多数据文件和单表空间的存储管理能力。相比于单表空间,将数据文件放置在MySQL data目录外,可以允许你单独对关键的表做优化,或者对指定的表做RAID、DRBD,或者绑定表到特殊的磁盘。

  • 通用表空间支持Antelope和Barracuda文件格式,因此支持所有的行格式以及相关的特性。对于两种文件格式的支持,通用表空间不依赖innodb_file_format, innodb_file_per_table的设置,即使设置了也不影响通用表空间。

  • CREATE TABLE可以创建通用表空间,单表空间和系统表空间的表。

  • 表空间可以用ALTER TABLE在通用表空间,单表空间和系统表空间之间移动。在以前,无法从单表空间移动到系统表空间。现在可以了,因为有了通用表空间。

系统表空间

系统表空间是一个或多个数据文件(ibdata files),它包含InnoDB相关对象(InnoDB数据字典)的元数据,还有一个或多个undo log、change buffer、doublewrite buffer。如果表被创建在系统表空间上而不是在单表空间和通用表空间上,那么它也可能包含InnoDB的表数据和索引数据。系统表空间中的数据和元数据在一个MySQL实例中会应用到所有的数据库。

在MySQL5.6.7之前,默认将所有的InnoDB表和索引放在系统表空间内,经常导致这个文件变得非常大。因为系统表空间从不减少,大量的临时数据载入然后再删除可能会导致存储问题。在MySQL5.7,默认为单表空间模式,每个表和相关的索引数据存储在单独的.ibd文件中,新的模式更容易使用InnoDB依靠Barracuda的行格式,例如:表压缩,高效的存储超出页的列,大的索引前缀(innodb_large_index)。

innodb_undo_tablespaces配置项允许你为undo logs配置分离的表空间文件,这部分任然被认为是系统表空间的一部分。

将数据放在系统表空间或分离的.ibd文件对存储管理有影响。MySQL Enterprise Backup产品可能备份一个大文件中的一小部分,或者许多小文件。在有上千张表的系统,文件系统去操作上千个.ibd文件可能会导致瓶颈。

(完)