0

MySQL5.7的InnoDB架构

 9 months ago
source link: http://www.lzhpo.com/article/179
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

Buffer Pool(缓冲池)

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

Change Buffer(变更缓冲区)

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

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

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

Log Buffer(日志缓冲区)

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

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

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

      ![](images/MySQL面试题/事务提交的时候将log buffer中的日志刷入log file中的时机.png)

    • 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?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK