原创

MySQL5.7的InnoDB架构

温馨提示:
本文最后更新于 2022年02月21日,已超过 756 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

MySQL5.7的InnoDB架构可以分为两部分:内存架构和磁盘架构。

内存架构

Buffer Pool(缓冲池)

  • 缓冲池是主内存中的一个区域,用于在 InnoDB访问表和索引数据时对其进行缓存。
  • 缓冲池允许直接从内存中访问经常使用的数据,从而加快处理速度。
  • 在专用服务器上,多达 80% 的物理内存通常分配给缓冲池。

Change Buffer(变更缓冲区)

  • 变更缓冲区是一种特殊的数据结构,当这些页不在缓冲池中时 ,它会缓存对二级索引页的更改。
  • 可能由INSERTUPDATEDELETE 操作 (DML) 导致的缓冲更改,然后会在其它读取操作将页加载到缓冲池中时合并。

Adaptive Hash Index(自适应哈希索引)

  • InnoDB会监控对表上各索引页的查询,如果对应的数据被访问的频次符合规则,那么就建立哈希索引来加快数据访问的速度,这个就叫做自适应哈希索引。
  • 哈希索引是针对经常访问的索引页的需求而构建的。

Log Buffer(日志缓冲区)

  • 日志缓冲区是保存要写入磁盘上日志文件的数据的内存区域。

  • 日志缓冲区的内容会定期刷新到磁盘。

    • 可以通过更改innodb_flush_log_at_trx_commit参数来控制日志缓冲区的内容如何写入和刷新到磁盘。

    • innodb_flush_log_at_timeout参数可以控制日志刷新频率。

  • 大型日志缓冲区使大型事务能够运行,而无需在事务提交之前将重做日志数据写入磁盘。

  • 如果有更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘 I/O。

磁盘架构

System Tablespace(系统表空间)

  • 系统表空间是 InnoDB数据字典、双写缓冲区、更改缓冲区和回滚日志的存储区域。

  • 如果表是在系统表空间而不是 file-per-table 或通用表空间中创建的,它还可能包含表和索引数据。

File-Per-Table Tablespaces(file-per-table表空间)

file-per-table 表空间包含单个 InnoDB表的数据和索引,并存储在文件系统中的单个数据文件中。

General Tablespaces(通用表空间)

通用表空间InnoDB 是使用CREATE TABLESPACE语法创建的共享表空间。

Undo Tablespaces(回滚表空间)

回滚表空间包含回滚日志,它们是记录的集合,其中包含有关如何回滚事务对聚集索引记录的最新更改的信息。

回滚日志默认存储在系统表空间中,但可以存储在一个或多个撤消表空间中。

Temporary Tablespace(临时表空间)

  • 里面存储着临时表或临时查询结果集的数据。
  • 临时表空间在正常关闭或中止初始化时被删除,并在每次服务器启动时重新创建。
  • 临时表空间在创建时会收到一个动态生成的空间ID。
  • 如果无法创建临时表空间,则拒绝启动。
  • 如果服务器意外停止,则不会删除临时表空间。在这种情况下,数据库管理员可以手动删除临时表空间或重新启动服务器,服务器会自动删除并重新创建临时表空间。
  • 临时表空间不能驻留在原始设备上。

InnoDB Data Dictionary(InnoDB数据字典)

InnoDB数据字典由内部系统表组成,其中包含用于跟踪表、索引和表列等对象的元数据 。

元数据物理上位于InnoDB系统表空间中。由于历史原因,数据字典元数据在某种程度上与存储在 InnoDB表元数据文件(.frm文件)中的信息重叠。

Doublewrite Buffer(双写缓冲区)

  • 双写缓冲区是一个存储区域,在 InnoDB将页写入 InnoDB数据文件中的适当位置之前,将从缓冲池中刷新的页写入其中。
  • 如果在页写入过程中出现操作系统、存储子系统或意外的mysqld进程退出, InnoDB则可以在崩溃恢复期间从双写缓冲区中找到该页的良好副本。

Redo Log(重做日志)

参考我的文章:什么是redo log?

Undo Logs(回滚日志)

参考我的文章:什么是undo log?

本文目录