墨墨导读:数据是以表空间来维护和存放的。在表空间中包含数据,结构,索引等信息,如何有效使用表空间对于MySQL来说非常重要。
数据库的表空间是用来存储数据的逻辑空间,也是存储数据的最大逻辑单元,其下还有段、区、页等逻辑数据类型。表空间设计是为了提升更高的IO,不同处理数据的解耦,便于管理。
通过表空间来实现对数据文件的灵活控制。目前MySQL8.0 版本Tablespaces,从原有的共享表空间,数据表空间分成如下5中表空间:
System tablespace
File-per-table tablespaces
General tablespaces
Undo Tablespace
Temporary Tablespaces
下面逐步了解一下。
1. System tablespace
系统表空间:到目前为止的8.0.23保留下来的就是change buffer的存储区域。如果表在系统表空间创建的,而不是在file-per-table或General表空间中创建的,那么它还包含表和索引数据。之前版本中,系统表空间包含InnoDB数据字典。还包含doublewrite缓冲区存储区域。从MySQL 8.0.20开始 分离出来生成单独的doublewrite文件。
innodb_data_home_dir =/opt/data8.0/dbdata
innodb_data_file_path = ibdata1:16M;ibdata2:16M:autoextend
备注:autoextend属性只能在innodb_data_file_path设置的最后一个数据文件中指定,对于系统表空间现有系统表空间的大小减少是不支持的。要实现更小的系统表空间,唯一的选择是将数据从备份恢复。Mysql里删除数据是不释放空间的。
所以之前版本的系统表空间是非常大的。为了避免使用大的系统表空间,可使用每个表文件的表空间。File-per-table表空间是默认的表空间类型,在创建InnoDB表时隐式使用。与系统表空间不同,在截断或删除在每个表文件表空间中创建的表之后,磁盘空间返回给操作系统。
2. File-per-table tablespaces
独立表空间包含单个InnoDB表的数据和索引,并存储在文件系统中自己的数据文件中。
#my.cnf配置
[mysqld]
innodb_file_per_table=ON
#命令行方式
mysql> SET GLOBAL innodb_file_per_table=ON;
mysql>CREATE TABLE city(
ID int
)ENGINE=Innodb TABLESPACE=innodb_file_per_table;
独立表空间优势:
truncate或drop在table操作,磁盘空间返回给操作系统。但共享表空间不会释放,只能用于InnoDB数据。换句话说,共享表空间数据文件的大小不会缩小。
在共享表空间中的表上执行表复制ALTER TABLE操作因为table-copying动作,会增加表空间所占用的磁盘空间增加。
独立表空间执行TRUNCATE表时,性能更好。
独立表空间数据文件可以在不同的存储设备上创建,用于I/O优化、空间管理或备份。
通过DISCARD/IMPORT TABLESPACE 方式迁移独立表空间
https://dev.mysql.com/doc/refman/8.0/en/innodb-table-import.html独立表空间中创建的表支持与动态和压缩行格式相关的特性,而系统表空间不支持这些特性。
存储在独立表空间数据文件中的表可以节省时间,当数据损坏发生时,当备份或二进制日志不可用时,或者当MySQL服务器实例不能重新启动时,成功恢复的机会会增加。独立表空间数据可以通过第三方工具进行分析和数据的抽取。还可以通过单独恢复独立表空间。
每个表文件表空间,允许通过监视表空间数据文件的大小来监视表大小。
当innodb_flush_method设置为O_DIRECT时,普通的Linux文件系统不允许对单个文件(如共享表空间数据文件)进行并发写操作。因此,当结合