InnoDB物理层七模块

InnoDB物理层七模块

InnoDB 的物理存储结构,指的是 MySQL 的数据是怎么存储在物理介质上的,由哪些磁盘文件组成。所谓逻辑存储结构,指的是这些数据是如何有结构地组织起来的。

InnoDB 物理存储结构(MySQL 8.0)

  1. 系统表空间(System Tablespace)=

  2. 独立表空间(File-Per-Table Tablespaces)=

  3. Redo Log 文件(Redo Log)=

  4. Undo 表空间(Undo Tablespaces),撤销表空间

  5. 双写缓存文件(Doublewrite Buffer Files)

  6. 通用表空间(General Tablespaces)

  7. 临时表空间(Temporary Tablespaces)

表空间

InnoDB存储引擎的逻辑存储结构是将所有的数据都被逻辑地放在了一个空间中,这个空间中的文件就是实际存在的物理文件(.ibd文件),即表空间。默认情况下,一个数据库表占用一个表空间,表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中,例如:表对应的数据、索引、insert buffer bitmap undo信息、insert buffer 索引页、double write buffer files 等都是放在共享表空间中的。

表空间分为系统表空间(ibdata1文件)(共享表空间)、临时表空间、常规表空间、Undo表空间和file-per-table表空间(独立表空间)。系统表空间又包括双写缓冲区(Doublewrite buffer)、Change Buffer等。

在物理层面上,表空间对应着磁盘上的一个或多个文件。默认情况下,InnoDB使用一个名为ibdata1系统表空间文件来存储所有数据库的数据和索引,但也可以配置为使用独立的表空间文件(即每个表一个文件)。

Mysql数据字典:是存储和管理数据的基础。 常见的字典对象包括数据库、表、字段等。 数据库字典是其中最重要的一种,它存储了关于数据库的元数据信息,如数据库的名称、创建时间、所属用户等。 表字典则包含了关于表的元数据,例如表的名称、表的类型、所属数据库等

表空间结构

表空间又由段(segment)、区( extent)、页(page)组成,页是InnoDB磁盘管理的最小单位。在我们执行sql时,不论是查询还是修改,mysql 总会把数据从磁盘读取到内存中,而且在读取数据时,不会单独加在一条数据,而是直接加载数据所在的数据页到内存中。表空间本质上就是一个存放各种页的页面池。

「页」是InnoDB管理存储空间的基本单位,也是内存和磁盘交互的基本单位。也就是说,哪怕你需要1字节的数据,InnoDB也会读取整个页的数据,InnoDB有很多类型的页,它们的用处也各不相同。比如:有存放undo日志的页、有存放INODE信息的页、有存放Change Buffer信息的页、存放用户记录数据的页(索引页)等等。

InnoDB默认的页大小是16KB,在初始化表空间之前可以在配置文件中进行配置,一旦数据库初始化完成就不可再变更了。

1.系统表空间

系统表空间,顾名思义就是 InnoDB 这个系统的默认表空间,也叫共享表空间,是在数据目录下创建一个名为.ibdata1,大小为 12M的文件。

系统表空间的管理涉及到数据文件的创建、扩展、收缩和删除等操作。当系统表空间不足时,InnoDB会自动扩展数据文件的大小以容纳更多的数据。同样,当数据被删除时,表空间不会自动收缩,这可能会导致磁盘空间的浪费。为了避免这种情况,管理员可以定期进行表空间优化操作,如重建表或导出/导入数据等。

若设置 innodb_file_per_table 为 off,则CREATE TABLE 语句创建的表数据,都会存储在系统表空间中。

若设置innodb_file_per_table为on,则表将独立地产生一个表空间文件,即独立表空间,以 ibd 结尾,数据、索引、表的内部数据字典信息都将保存在这个单独的表空间文件中。

2.独立表空间

在MySQL5.6.6以及之后的版本中, InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已。

独立表空间只是存放数据、索引和插入缓冲Bitmap页,其他类的数据如回滚(undo)信息、插入缓冲索引页、系统事务信息、二次写缓冲等还是存放在原来的系统表空间。

同时,当某个表的数据量很大时,独立表空间可以更有效地利用磁盘空间。

3.Undo 表空间

数据默认在系统表空间 ibdata1 文件中,因为共享表空间不会自动收缩,也可以单独创建一个 undo 表空间。

4.Redo Log 文件

redo log记录数据库的变更,数据库崩溃后,会从redo log获取事务信息,进行系统恢复。redo log在磁盘上表现为ib_logfile0和ib_logfile1两个文件。MySQL会在事务的提交前将redo日志刷新回磁盘。

在同一时间提交的事务,会采用组提交(group commit)的方式一次性刷新回磁盘。从而避免一个事务刷新一次磁盘,提高性能。

5.双写缓存文件

保障 InnoDB 存储引擎操作数据页的可靠性。double write 分为两部分组成,一部分在内存中的 double write buffer, 大小为 2MB,另一部分是物理磁盘上共享表空间中连续的128个数据页,即2个区大小(同样是2MB)。

6.通用表空间

与系统表空间类似,可以用于存储表的数据和索引。其作用是可以将一些业务逻辑不同的表,存放在这个通用表空间中,从而达到物理隔离的作用。

7.临时表空间

存储临时表的数据,包括用户创建的临时表,和磁盘的内部临时表。对应数据目录下的 ibtmp1 文件。当数据服务器正常关闭时,该表空间被删除,下次重新产生。

表空间优化

1.合理使用表空间类型

根据实际需求选择合适的表空间类型。对于小型数据库或测试环境,可以使用默认的系统表空间;而对于大型数据库或需要高效备份恢复的场景,可以考虑使用独立表空间。

2.定期优化表空间

对于系统表空间,定期进行表空间优化操作,如重建表、优化索引等,以释放未使用的磁盘空间。对于独立表空间,可以通过导出/导入数据或使用ALTER TABLE语句来重新整理表空间。

3.监控表空间使用情况

通过监控工具或查询系统表来定期检查表空间的使用情况,确保数据库的正常运行和性能稳定。