下图显示了组成 InnoDB 存储引擎架构的内存和磁盘结构。有关每种结构的信息,请参阅第14.5节“ InnoDB 内存结构”第14.6节“ InnoDB On-Disk 结构”
image.png

一、内存架构

1.1、Buffer Pool

采用 LRU 算法。该算法保留了新子列表中常用的页面。旧的子列表包含较少使用的页面; 这些页面可能会被逐出。

  • 在开头,是最近访问的新(“young”)页面的子列表
  • 在尾部,是最近访问过的旧页面的子列表

Buffer Pool List 入下图所示:
image.png

1.2、Change Buffer

主要是在 secondary index 页不在时使用。可能由 INSERT、 UPDATE 或 DELETE 操作(DML)导致的错误,在稍后通过其他读操作将页加载到缓冲池时合并到一起。
image.png

二、磁盘架构

2.1 表

https://dev.mysql.com/doc/refman/5.7/en/innodb-tables.html

2.2 索引

https://dev.mysql.com/doc/refman/5.7/en/innodb-indexes.html

2.3 表空间

https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace.html

2.4 系统数据字典

https://dev.mysql.com/doc/refman/5.7/en/innodb-data-dictionary.html

2.5 Doublewrite Buffer

https://dev.mysql.com/doc/refman/5.7/en/innodb-doublewrite-buffer.html

2.6 Redo Log

是在崩溃恢复期间使用的基于磁盘的数据结构,用于纠正由不完整事务写入的数据。在正常操作期间,Redo Log 对更改 SQL 语句或底层 API 调用产生的表数据的请求进行编码。在意外关闭之前未完成数据文件更新的修改将在初始化期间和接受连接之前自动重播。

默认情况下,Redo Log 在磁盘上由两个名为 ib_logfile0 和 ib_logfile1 的文件物理表示。以循环的方式写入Redo Log 文件。Redo Log 中的数据按照受影响的记录进行编码; 这些数据统称为 redo。数据通过 Redo Log 的过程由一个不断增加的 LSN 值表示。

2.7 Undo Log

undo log 是与单个读写事务关联的撤销日志记录的集合。undo log记录包含有关如何 undo 事务对 clustered index 记录的最新更改的信息。如果另一个事务需要将原始数据视为一致读操作的一部分,则从 undo log 记录检索未修改的数据。undo log 存在于 undo log segments 中,undo log 段包含在rollback segments中。回滚段驻留在system tablespaceundo tablespacestemporary tablespace中。

驻留在临时表空间中的 undo log 用于修改用户定义临时表中的数据的事务。这些 undo log 不会重做记录,因为它们不是崩溃恢复所需的。它们仅用于服务器运行时的回滚。这种类型的 undo log 可以避免重做日志 i/o,从而提高性能。