InnoDB 的数据会放在一个表空间或者文件空间(英文名: table space 或者 file space)的概念,这个表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件〈不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多很多很多个页,我们的表数据就存放在某个表空间下的某些页里。表空间有好几种类型。

系统表空间(system tablespace)

这个所谓的系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB 会在数据目录下创建一个名为 ibdata1(在你的数据目录下找找看有木有)、大小为 12M 的文件,这个文件就是对应的系纳表空间在文件系统上的表示。
image.png
这个文件是所谓的自扩展文件,也就是当不够用的时候它会自己增加文件大小,当然,如果你想让系统表空间对应文件系统上多个实际文件,或者仅仅觉得原来的 ibdata1 这个文件名难听,那可以在 MySQL 启动时配置对应的文件路径以及它们的大小,我们也可以把系统表空间对应的文件路径不配置到数据目录下, 甚至可以配置到单独的磁盘分区上。
需要注意的一点是,在一个 MySQL 服务器中,系统表空间只有一份。从MySQL5.5.7 到 MySQL5.6.6 之间的各个版本中,我们表中的数据都会被默认存储到这个系统表空间。

独立表空间(file-per-table tablespace)

在 MySQL5.6.6 以及之后的版本中,InnoB 并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd 的扩展名而已,所以完整的文件名称长这样:表名.ibd
比方说假如我们使用了独立表空间去存储 xiaohaizi 数据库下的 test 表的话, 那么在该表所在数据库对应的 xiaohaizi 目录下会为 test 表创建这两个文件:test.frm(表结构)和 test.ibd(表数据)
image.png
其中 test.ibd 文件就用来存储 test 表中的数据和索引。当然我们也可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数
innodb_file_per_table 控制,比如说我们想刻意将表数据都存储到系统表空间时,可以在启动 MySQL 服务器的时候这样配置:
[server] innodb_file_per_table=0
当 imodb_file_per table 的值为 0 时,代表使用系统表空间;当 innodb_file per table 的值为 1 时,代表使用独立表空间。不过 inmodb_file_per_table 参数只对新建的表起作用,对于已经分配了表空间的表并不起作用。

其他类型的表空间

随着 MySQL 的发展,除了上述两种老牌表空间之外,现在还新提出了一些不同类型的表空间,比如通用表空间(general tablespace) ,undo 表空间(undotablespace)、临时表空间〈temporary tablespace)等。