一、什么是表?
用过MySQL都知道,直观上看,MySQL的数据都存在数据表中。比如一条Update SQL:update user set username = '白日梦' where id = 999;这里的user其实就是数据表。当然这不是重点,重点是数据表其实是逻辑上的概念。而下面要说的表空间是物理层面的概念。
二、什么是表空间?
“在innodb存储引擎中数据是按照表空间来组织存储的”。表空间是实际存在的物理文件,对应着磁盘上的物理文件。
2.1 sys表空间
可以使用 show variables like '%innodb_data_file_path%';查看你的MySQL的系统表空间:
Value部分的的组成是:name:size:attributes。默认情况下InnoDB存储引擎有一个共享表空间ibdata1,所有的数据都存放在这个表空间中。ibdata1表空间的大小为12MB,并且随着数据的增多,它会自动扩容。
2.1.1 配置sys表空间
系统表空间的数量和大小可以通过修改启动参数:innodb_data_file_path
# my.cnf[mysqld]innodb_data_file_path=/dir1/ibdata1:2000M;/dir2/ibdata2:2000M:autoextend
ibdata1表空间为固定大小2000M,而ibdata2的2000M使用完后会自动增长。
假设你的服务器有两块存储A、B。并且A、B上分别挂载着dir1目录和dir2目录。那你再看上面的配置,它其实是在使用两个不同磁盘上的文件共同构建表空间。由于这两个文件位于不同的磁盘上,磁盘的负载就会被均分,数据库整体的性能也有所提升。
表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。默认情况下InnoDB存储引擎有一个共享表空间ibdata1,所有的数据都存放在这个表空间中。如果用户开启了参数innodb_fiule_per_table,则每张表内的数据可以单独放在一个表空间中。
即使启用了innodb_fiule_per_table,每张表的表空间内从存放的也只是数据、索引和插入缓冲Bitmap页,其他类型的数据比如回滚(undo)、插入缓冲索引页、系统事务信息、二次写缓冲(Double write buffer)等还是存放在原有共享表空间。
2.2 file per table 表空间
如果你想让每一个数据库表都有一个单独的表空间文件的话,可以通过参数innodb_file_per_table设置。
这个参数只有在MySQL5.6或者是更高的版本中才可以使用。
可以通过配置文件:
[mysqld]
innodb_file_per_table=ON
将其设置为ON,那之后InnoDB存储引擎产生的表都会自己独立的表空间文件。独立的表空间文件命名规则:表名.ibd
注意: 独立表空间文件中仅存放该表对应数据、索引、insert buffer bitmap。 其余的诸如:回滚(undo)、插入缓冲索引页、系统事务信息、二次写缓冲(Double write buffer)等信息依然放在默认表空间,也就是共享表空间中。 即使你设置了innodb_file_per_table=ON 共享表空间的体量依然会不断的增长,并且即使不断的使用undo进行rollback,共享表空间大小也不会缩减。
2.2.1 file per table的优缺点
- 优点:
- 一个表单独存储为一个文件更容易管理,而且在你不需要这个表的时候,通过 drop table 命令,系统就会直接删除这个文件。而如果是放在共享表空间中,即使表删掉了,空间也是不会回收的。
- 提升容错率,表A的表空间损坏后,其他表空间不会收到影响。
- 使用MySQL Enterprise Backup快速备份或还原在每表文件表空间中创建的表,不会中断其他InnoDB 表的使用。
- 缺点:
- 对fsync系统调用来说不友好,如果使用一个表空间文件的话单次系统调用可以完成数据的落盘,但是如果你将表空间文件拆分成多个。原来的一次fsync可能会就变成针对涉及到的所有表空间文件分别执行一次fsync,增加fsync的次数。
2.3 临时表空间
临时表空间用于存放用户创建的临时表和磁盘内部临时表。
参数 innodb_temp_data_file_path 定义了临时表空间的一些名称、大小、规格属性如下图:
参数 innodb_data_home_dir 查看临时表空间文件存放的目录。
2.4 undo表空间
相信你肯定听过说undo log,常见的当你的程序想要将事物rollback时,底层MySQL其实就是通过这些undo信息帮你回滚的。
在MySQL的设定中,有undo表空间专门用来存放undo log。可以通过参数 innodb_undo_tablespaces 看看你的MySQL undo表空间的使用情况:
- 默认情况下undo log tablespace个数是0,也就是说如果你不干涉MySQL的配置。那么MySQL就会帮你将undo log记录到共享表空间中;
- 可以通修改配置,设置undo表空间,专门存放undo log。
修改后mysql相关配置:
那undo log到底是该使用默认的配置放在系统表空间呢?还是该放在undo表空间呢?这其实取决服务器使用的存储卷的类型。如果是SSD存储,那推荐将undo info存放在 undo表空间中。
