整合几个资料,自己画的InnoDB体系图:
InnoDB体系架构.png

本篇文章主要内容就是介绍这张图中的所有内容。由图可知,InnoDB存储引擎主要由两部分组成:后台线程和内存池。使用多线程的作用就是能充分发挥现在计算机的性能,而内存池的使用是为了解决CPU与磁盘速度不匹配的问题,下面分别介绍。

1、后台线程

主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外,将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常情况下InnoDB能恢复到正常的运行状态。

1.1、Master Thread

负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓存,undo log页的回收。

1.2、IO Thread

InnoDB用了大量的异步IO处理IO请求,IO Thread主要负责处理这些请求的回掉,包括10个线程,分别为4个write、4个read、1个insert buffer、1个log Thread,分别负责读写请求的IO回调、insert buffer、重做日志。

1.3、Purge Thread

事务提交后,需要回收undo log,Purge Thread就是做这件事情,InnoDB支持多个Purge Thread,以加快回收。

1.4、Page Cleaner Thread

主要作用就是刷新脏页的,这个工作以前在Master Thread中实现,现在单独拉出来一个线程,减少对于用户查询线程的阻塞。

2、内存池

作用是维护所有进程或者线程需要访问的多个内部数据结构,缓存磁盘上的数据,方便快速地读取,重做日志(redo log)缓冲。

2.1、Redo Log Buffer

InnoDB存储引擎先将重做日志放入缓冲区,之后以一定的频率刷新到重做日志文件。刷新的情况有:

  • Master Thread每1秒刷新。
  • 事务提交时刷新。
  • 重做日志缓存剩余空间小于二分之一时刷新。

2.2、Additional Memory Pool

用来缓存LRU链表、锁,等待,等数据信息。

2.3、InnoDB Buffer Pool

缓冲池是占最大块内存的部分,用来存放各种缓存。因为InnoDB的存储引擎工作方式总是将数据库文件按页(每页16K)读取到缓冲池,
然后按最近最少使用(LRU)的算法来保留缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓冲池中的页(发生修改后,该页即为脏页),
然后再按照一定的频率将缓冲池的脏页刷新到文件。

缓冲池中存储的数据页类型有:

  • 索引页(Data Page)
  • 数据页(Index Page)
  • Undo页(Undo Page)
  • 插入缓存(Insert Buffer)
  • 自适应哈希索引(Adaptive Hash Index)
  • InnoDB存储的锁信息(Lock Info)
  • 数据字典信息(data dictionary)

tencent.jpg