MYSQL进阶-InnoDB引擎之架构
整体架构
左侧内存结构,右侧磁盘结构

内存结构

缓冲池
buffer pool 缓冲池:缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。
缓冲池以page页为单位,底层采用链表数据结构管理Page。根据状态,将Page分为三种类型:
- free page:空闲Page,未被使用过
- clean page:被使用Page,数据没有背修改过
- dirty page:脏页,被使用Page,数据被修改过,页中数据和磁盘的数据产生了不一致。
更改缓冲区
change buffer(8.0引入)更改缓冲区(针对于非唯一二级索引页):在执行DML(增删改)语句时,如果这些数据在buffer pool中不存在,不会直接操作磁盘,而是将这些数据变更存在change buffer中,在未来数据被读取时,再将数据合并恢复到buffer pool中,再将合并后的数据刷新到磁盘中。
change buffer的意义:
由于二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引。同样,删除和更新可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO。有了changeBuffer后,我们可以在缓冲池中进行合并处理,减少磁盘IO。

自适应hash
adaptive Hash Index 自适应hash索引:用于优化对buffer pool数据的查询。InnoDB存储引擎会监控对表上各索引页的查询,如果观察到hash索引可以提升速度,则自动建立hash索引,称之为自适应hash索引。
自适应哈希索引时系统根据情况自动完成的,无需人工干预。
使用命令查看相关参数是否开启:
show variable like '%hash_index%'

日志缓冲区
log buffer 日志缓冲区:用于保存要写到磁盘中的log日志数据(redo log、undo log),默认大小为16M,日志缓冲区的日志定期刷新到磁盘中。如果需要更新、插入或删除多行的事务,增加日志缓冲区的大小可以节省磁盘IO。
参数:
innodb_log_buffer_size:缓冲区大小,默认16M
innodb_flush_log_at_trx_commit:日志刷新到磁盘的时机,默认为1,取值有:
- 1:日志在每次事务提交时写入并刷新到磁盘
- 0:每秒钟将日志写入并刷新到磁盘
- 2:日志在每次提交后写入,并每秒钟刷新一次磁盘
磁盘结构

系统表空间
system tablespace系统表空间:是更改缓冲区的存储区域。如果表是在系统表空间而不是每个表文件或通用表空间中创建的,它也可能包含表和索引数据。
参数:innodb_data_file_path
独立表空间
file-per-table tablespace:每个表的文件表空间包含单个Innodb表的数据和索引,并存储在文件系统上的单个数据文件中。(默认开启,即每张表都有自己的独立表空间)
参数:innodb_file_per_table (默认ON,每一张表都有自己的ibd文件)
通用表空间
general tablespace统用表空间:需要通过create tablespace语法手动创建通用表空间,在创建表时,可以指定该表空间。
# 创建通用表空间
create tablespace ts add datafile 'file_name.ibd' engine = innodb; # 指定表空间 create table a (id int primary key suto_increment, name varchar(10)) engine = innodb tablespace = ts
撤销表空间
undo tablespace撤销表空间:MYSQL实例在初始化时会自动创建两个默认的undo表空间undo_001和undo_002(初始大小为16M),用于存储undo log日志。
临时表空间
temporary tablespace:Innodb使用会话临时表空间和全局临时表空间,存储用户创建的临时表等数据。
双写缓冲区
doublewrite buffer files双写缓冲区:innoDB引擎将数据从bufferpool刷新到磁盘前,先将数据写入双写缓冲区文件中,便于系统异常时恢复数据。

重做日志
redo log重做日志:是用来实现事务的持久性。该日志包含重做日志缓冲区(redo log buffer)和重做日志文件(redo log)前者在内存中,后者在磁盘中。当事务提交后会把所有的修改信息存储到该日志当中,用于刷新脏页到磁盘时,发生错误时,进行数据恢复使用。redolog是循环写的,不会永久保存,每隔一段时间清理之前没有用的redolog。主要作用是在异常时用于数据恢复,从而保证事务的持久性。
以循环方式写入重做日志文件,涉及两个文件:

后台线程

master thread
核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保证数据的一致性,还包括脏页的刷新、合并插入缓存、undo页的回收。
IO thread
在InnoDB引擎中大量使用了AIO(异步IO)来处理IO请求,极大地提高了数据库的性能,而IO Thread主要负责这些IO请求的回调。

Purge thread
主要用于回收事务已经提交的Undo log,在事务提交后,undo log可能不用了,Purge thread负责回收。
Page clean thread
用于协调master thread刷新脏页到磁盘,减轻master thread的工作压力,减少阻塞。

浙公网安备 33010602011771号