目录

架构

架构-内存结构

​Buffer Pool:缓冲池

Change Buffer:更改缓冲区

Adaptive Hash Index:自适应hash索引

​LogBuffer:日志缓冲区

架构-磁盘结构

System Tablespace:系统表空间

File-Per-Table Tablespace:独立表空间间

General Tablespaces:通用表空间

Undo Tablespace:撤销表空间

Temporary Tablespaces:临时表空间

Doublewrite Buffer Files:双写缓冲区

Redo log:重做日志

架构-后台线程

Master Thread

IO Thread

Purge Thread

Page Cleaner Thread


架构

架构-内存结构


Buffer Pool:缓冲池

是位于主存储器中的一片区域,用于缓存访问过的表和索引数据。在执行增删改查操作时,先操作缓冲池中的数据,若缓冲区没有数据,则从磁盘加载并缓存,然后再以一定频率刷新到磁盘,减少磁盘IO。缓冲池允许直接从内存处理频繁使用的数据,这加快了处理速度
为了提高大容量读操作的效率,缓冲池被分割成一个个可以容纳多行的页(pages),为了方便缓存管理,缓冲池被实现成页的链表结构。
缓冲区以Paeg页为单位,根据状态将页分为三种类型:

  • free page:空闲page,未被使用
  • clean page:被使用page,数据没有被修改过
  • dirty page:脏页,被使用page,数据被修改过,页中的数据与磁盘的数据产生的不一致(未刷新到磁盘)

Change Buffer:更改缓冲区

在执行DML语句时,如果这些数据page没有在Buffer Pool中,不会直接操作磁盘,而是将数据更存在更改缓冲区中,等待这个被更改数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据1刷新到磁盘中。
意义是什么?
每一次操作磁盘,会造成大量的磁盘IO,有了ChangebUFFER之后,我们可以在缓冲池进行合并处理减少磁盘IO

Adaptive Hash Index:自适应hash索引

用于优化对Buffer Pool数据的查询,InnoDB会监控对表上各索引页的查询,如果观察到使用hash索引可以提升速度,则建立hash索引,这就是自适应hash索引。
自适应哈希索引,不需要人工干预,是系统自动完成
参数:adaptive_hash_index查看此参数是否默认开启
show variables like ‘%hash_index%’;


LogBuffer:日志缓冲区

用来保存要写入磁盘中的log日志数据(reod log 、undo log),默认大小为16MB,日志缓冲区的日志会定期刷新到磁盘中。
参数:innodn_log_butter_size:缓冲区大小(可以增加缓冲区大小)
innodb_flush_log_at_trx_commit:日志刷新到磁盘时机

value值有三种情况
1:日志在每次1事务提交时写入并刷新到磁盘
0:每秒将日志写入并刷新到磁盘1一次
2:日志在每次事务提交后写入,并每秒刷新到磁盘一次

对于MySQL,80%的内存会给到缓冲区。

架构-磁盘结构

System Tablespace:系统表空间

是更改缓冲区的存储区域。如果表没有独立表空间,那么他的数据索引也存放在系统表空间。
在8.0版本之后,重新规划了系统表空间
在5.几版本时,还会存放字典日志等信息

参数:innodb_data_file_path

File-Per-Table Tablespace:独立表空间间

参数:innodb_file_per_table默认开启,即每个表都有独立表空间

General Tablespaces:通用表空间

需要通过create tablespace 语法创建通用表空间,在创建表时,可以指定该表空间

Undo Tablespace:撤销表空间

MySQL实例在初始化时会自动创建两个默认的undo表空间,初始大小为16M,用于存储undo log日志。

Temporary Tablespaces:临时表空间

InnoDB使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。

Doublewrite Buffer Files:双写缓冲区

InnoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据
则InnoDB可以在崩溃恢复期间从doublewrite缓冲区中找到页面的良好副本,也就是innodb拥有崩溃恢复特性

Redo log:重做日志

用来实现事务的持久性,由重做日志缓冲(redo log buffer)以及重做日志文件(redo log)组成,前者在内存,后者在磁盘。
当事务提交后会把所有修改信息都存到该日志中,用于在刷新脏页到磁盘时,发生错误,进行数据恢复使用
不会永久保存,会定时清理没有用的redo log
以循环方式写入重做日志文件涉及两个文件:ib_logfile0ib_logfile1

架构-后台线程

作用:将InnoDB缓冲池中的数据刷新到磁盘文件当中

Master Thread

核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保持数据的一致性,还包括脏页的刷新、合并插入缓存、undo页的回收

IO Thread

在InnoDB中大量使用了AIO来处理IO请求,这样可以极大提高数据库的性能,而IO Thread 主要负责这些IO请求的回调
查看InnoDB引擎的状态 show engine innodb status;

Purge Thread

主要用于回收事务已经提交了的undo log。在事务提交之后,undo log可能没有用了,就用Purge Thread来回收

Page Cleaner Thread

协助Master Thread刷新脏页到磁盘,可以减轻Master Thread的工作压力,减少阻塞。