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的工作压力,减少阻塞。

 

posted @ 2023-07-20 14:43  mooonquakes  阅读(25)  评论(0)    收藏  举报