INNODB结构分析

 

 

后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最新的数据,将已修改的文件刷新到磁盘文件

保证数据库发生异常时 InnoDB能够恢复到正常运行的状态

 

 

 

后台线程

使用的是多线程模型,其后台有多个不同的线程负责处理不同的任务

 

1.Master Thread

最核心的一个线程,主要负责将换种池中的数据异步刷新到磁盘,保证数据一致性,包括脏页的刷新,合并插入缓冲,UNDO页的回收等

 

2.IO Thread

在InnoDB存储引擎中大量舒勇异步IO来处理些IO请求, IO Thread 的工作主要是负责这些 IO 请求的回调.

 

3. Perge Thread

事物被提交之后, undo log 可能不再需要,因此需要 Purge Thread 来回收已经使用比分配的 undo页. InnoDB 支持多个 Purge Thread, 这样做可以加快 undo 页的回收
InnoDB 引擎默认设置为4个 Purge Thread:

4.Page Cleaner Thread

Page Cleaner Thread是在InnoDB1.2.x版本中引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能

内存

 

1.缓冲池

缓冲池是占最大块内存的部分,用来存放各种数据的缓存,因为InnoDB存储引擎的工作方式总是将数据库文件按页(每页16k)读取到缓冲池,然后按照最近最少使用LRU

的算法保留缓冲池的缓存数据,如果数据库文件需要修改,先修改缓冲池中的页(发生修改后该页即为脏页),然后按照一定的频率将缓存中的脏页flush到文件,可以

通过指令 SHOW ENGINE INNODB STAYUS来查看innodb_buffer_pool的具体使用情况

 

 

缓冲池中缓存的数据页类型有:索引页、数据页、 undo 页、插入缓冲、自适应哈希索引、 InnoDB 的锁信息、数据字典信息等.索引页和数据页占缓冲池的很大一部分.
 


下图显示 InnoDB 存储引擎总内存的结构情况.

 

 

 

 

 

 

 

2.重做日志缓冲

 

将重做日志放入这个缓冲区,然后按照一定的频率将其刷新到重做日志文件,该值设置一般不需要设置的很大,因为一般情况

下每秒就会将重做日志缓冲刷新到日志文件,因此,我们只需要保证每秒产生的事务量在这个缓冲大小之内即可

 

因为在下列三种情况下重做日志缓冲中的内容会刷新到磁盘的重做日志文件中.

  1. Master Thread 每一秒将重做日志缓冲刷新到重做日志文件

  2. 每个事物提交时会将重做日志缓冲刷新到重做日志文件

  3. 当重做日志缓冲剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件

 

额外的内存池

在 InnoDB 存储引擎中, 对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请.例如,分配了缓冲池,但是每个缓冲池中的帧缓冲还有对应的缓冲控制对象,这些对象记录以一些诸如 LRU, 锁,等待等信息,而这个对象的内存需要从额外的内存池中申请.

 


如下是我的微信技术公众号,大家多多关注哈,你们能看我才有动力写下去,毕竟读源码不如约会好玩大哭