原创
MySQL5.7的InnoDB架构
温馨提示:
本文最后更新于 2022年02月21日,已超过 1,005 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
MySQL5.7的InnoDB架构可以分为两部分:内存架构和磁盘架构。
内存架构
Buffer Pool(缓冲池)
- 缓冲池是主内存中的一个区域,用于在
InnoDB
访问表和索引数据时对其进行缓存。 - 缓冲池允许直接从内存中访问经常使用的数据,从而加快处理速度。
- 在专用服务器上,多达 80% 的物理内存通常分配给缓冲池。
Change Buffer(变更缓冲区)
- 变更缓冲区是一种特殊的数据结构,当这些页不在缓冲池中时 ,它会缓存对二级索引页的更改。
- 可能由
INSERT
、UPDATE
或DELETE
操作 (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?
- 本文标签: MySQL
- 本文链接: http://www.lzhpo.com/article/179
- 版权声明: 本文由lzhpo原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权