(1)什么是表空间?
    简单来说,我们平时创建的那些表,其实都是有一个表空间的概念,在磁盘上都会对应着“表名.ibd” 这样的一个磁盘数据文件。
    有的表空间可能对应多个磁盘文件,比如系统表空间,我们自己创建的表对应的表空间可能就是对应一个 “表名.ibd” 数据文件,然后在表空间的磁盘文件里会有很多的数据页,一个数据页不过16KB,不可能一个数据页就是一个磁盘文件。所以一个表空间的磁盘文件有很多的数据页。
    又由于一个表空间里包含的数据页实在太多,不便于管理,所以在表空间里又引入一个数据区的概念,英文 extent,一个数据区对应着连续的64个数据页,每个数据页16KB,所以一个数据区是1MB,然后256个数据区被划分为了一组。

    对于表空间,他的第一组数据区的第一个数据区的前3个数据页,都是固定的,里面存放描述性数据;例如:
    FSP_HDR 数据页,里面存放了表空间和这一组数据区的一些属性
    IBUF_BITMAP 数据页,存放这一组数据页的所有的 insert buffer 的一些信息
    INODE 数据页,也存放了一些特殊的信息。
    其实不须过于追究,只需知道每个数据组的第一个数据区的前3页,都是存放一些特殊信息的。然后这个表空间的其他各组数据区的,每组数据区的第一个数据区的头两页,也是存放特殊信息的,比如XDES数据页就是用来存放这一组数据区的一些相关属性,其实就是很多描述这组数据区的信息。
    插入数据的时候怎么找到具体表空间里的哪个组里的哪个extent的哪个数据页?插入时根据id找
    总结
    平时创建的表都是有对应的表空间,每个表空间对应磁盘上的数据文件,在表空间里有很多组数据区,每个数据组有256个数据区,每个数据区包含64个连续的数据页就是1MB,然后每组数据区的第一个数据区的头三页都是存放特殊信息的,表空间其他组的数据的头两页也是存放特殊信息的。
    所以磁盘上的各个表空间的数据文件是通过数据区的概念,划分很多的数据页,因此当我们执行crud操作的时候,就是从磁盘上的表空间对应的数据文件里,去加载一些数据页出来到BufferPool的缓存页去使用。
    表空间 = N 数据组;
    数据组 = 256
    数据区(256 1M);
    数据区 = 64
    数据页 = 64 * 16K = 1M;
    数据页 = 16K (包含多行数据)

    6865200_1582721462.jpgimage.png

    表空间::
    默认情况下InnoDB存储引擎有一个共享表空间ibdata1,即所有数据都放在这个表空间内。如果我们配置了参数 innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内。其对应的存储文件都放在 innodb_data_home_dir 指定的目录下。
    当启用了 innodb_file_per_table 参数选项,需要注意的是,每张表的表空间内存放的只是数据、索引和插入缓冲,其它的数据,如撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内。这也就说明了另一个问题:即使在启用了参数 innodb_file_per_table ,共享表空间还是会不断地增加其大小。
    https://blog.csdn.net/u010647035/article/details/105009979