What TableSpace

  • 表空间是一个存储位置,可以保存实际的底层数据库对象的数据。在MySQL里面,它主要存储InnoDB存储引擎的底层数据。它在物理数据和逻辑数据之间提供了一个抽象层

  • 表空间只指定数据库存储位置,而不指定逻辑数据库结构或数据库模式

  • 虽然表空间通常将数据存储在文件系统文件中,但单个文件必须是单个表空间的一部分

MySQL启动后,会自动创建二个系统表空间,存储系统信息

  • innodb_system

    包含innodb数据字典(innodb相关对象的元数据),同时,双写缓冲(doublewrite buffer)、改变缓冲(change buffer)和undo日志(undo logs)等也存储于系统表空间中。此外,系统表空间也包含用户在该表空间创建的表和索引等数据。由于系统表空间可以存储多张表,因此,其为一个共享表空间

Why TableSpace

通过使用表空间,管理员还可以控制安装的磁盘布局。表空间的一个常见用途是优化性能。

例如,可以将大量使用的索引放置在快速SSD上。另一方面,包含很少被访问的归档数据的数据库表可以存储在一个便宜但速度较慢的磁性硬盘驱动器上

How TableSpace

MySQL8.0及以上,使用InnoDB引擎后,默认开启每个单独的表都会单独使用表空间。

1.增加配置项

在新增前,需要确认新增的目录是否在MySQL目录内

1
2
3
[mysqld]
innodb_file_per_table = 1 # default is enable
innodb_directories = "/var/lib/mysql;/data"

2. 建表的差异

    1. 在指定目录创建表空间
1
CREATE TABLESPACE test_ts ADD DATAFILE '/data/testts.ibd' ENGINE=INNODB;
    1. 在建表时指定表空间
1
CREATE TABLE test01(id INT) TABLESPACE=test_ts;

注意: 在创建表时指定表空间,删除表时,指定的表空间并不会被删除。但表空间的数据会清空。

    1. 给现有空间添加数据文件
1
2
/* Only NDB Engine supported*/
ALTER TABLESPACE name ADD DATAFILE '/data/file2.ibd';

注意: MySQL8Innodb引擎不支持,只支持一个TableSpace一个数据文件,如果要支持多个Datafile对应一个Tablespace只能使用NDB引擎

Maintains 维护

  • 查询系统表空间信息
1
SELECT FILE_NAME, FILE_TYPE, TABLESPACE_NAME  FROM INFORMATION_SCHEMA.FILES;
  • 删除表空间

如果表空间被表使用,不能被删除

1
DROP TABLESPACE test_ts;

在实践中,可以将数据库服务器挂载不同磁盘,建表时,指定TABLESPACE,并将TABLESAPCE的数据文件建立在不同的目录下,这样分摊I/O