一、Innodb存储引擎的架构图
左边内存块分为4大块:Buffer Pool、Change Buffer、AdaptiveHash Index、Log Buffer
AdaptiveHash Index表示自适应哈希索引,这里记住Log Buffer并不在Innodb Buffer Pool里面。
Innodb buffer pool包含 AdaptiveHash Index、changge buffer、数据页、索引页、数据字典等信息。
1、System Tablespace系统表空间
系统表空间Change Buffer更改缓冲区的存储区域。即如果innodb引擎当中我们每一张表的独立表空间开关关闭着的话,那么所有的表的数据以及索引也是在系统表空间的(在MySQL5.x版本中还包含InnoDB数据字典、undolog等)
参数:innodb_data_file_path
系统表空间,默认的文件名叫 ibdata1。
show variables like 'innodb_data_file_path';
2、File-Per-Table Tablespaces每张表的独立表空间
如果开启了innodb_file_per_table开关 ,则每个表的文件表空间包含单个InnoDB表的数据和索引 ,并存储在文件系统上的单个数据文件中。
开关参数:innodb_file_per_table ,该参数默认开启。
那也就是说,如果参数开启,我们每创建一个表,都会产生一个表空间文件,并不会在System Tablespace。
3、 General Tablespaces通用表空间
通用表空间,需要通过 CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间
4、Undo Tablespaces撤销表空间
Undo Tablespaces叫做撤销表空间,也叫做undo表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储undo log日志。
5、Temporary Tablespaces临时表空间
InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。
6、 Doublewrite Buffer Files双写缓冲区文件
双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。
7、Redo Log重做日志
重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中, 用于在刷新脏页到磁盘时,发生错误时, 进行数据恢复使用。
Redo Log里的内容不会永久保存,会每隔一段时间及进行清理之前没有用的Redo Log里的内容
以循环方式写入重做日志文件,涉及两个文件
存储在ib_logfile0和ib_logfile1中
二、Innodb后台线程
后台线程的作用就是将Innodb存储引擎的缓冲池当中的数据在合适的时机刷新到磁盘文件当中
接下来,就来介绍一些InnoDB中涉及到的后台线程:
在InnoDB的后台线程中,分为4类,分别是:
Master Thread 、IO Thread、Purge Thread、Page Cleaner Thread。
核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中, 保持数据的一致性,还包括脏页的刷新、合并插入缓存、undo页的回收 。
在InnoDB存储引擎中大量使用了AIO(异步非阻塞IO)来处理IO请求, 这样可以极大地提高数据库的性能,而IOThread主要负责这些IO请求的回调。
show engine innodb status
主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收
协助 Master Thread 刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞
参考:MySQL之InnoDB存储引擎-架构_GoGo在努力的博客-CSDN博客