InnoDB的体系架构-后台线程与内存

InnoDB的体系架构-后台线程与内存,第1张

InnoDB的体系架构-后台线程与内存

文章目录
  • 一、InnoDB体系架构
  • 二、后台线程
    • 1.Master Thread :
    • 2.IO Thread :
    • 3.Purge Thread :
    • 4.Page Cleaner Thread
  • 三、内存
    • 1. 缓存池
    • 2. LRU List、Free List、Flush List
    • 3.重做日志缓冲:

一、InnoDB体系架构

Innodb存储引擎缓存池用于缓存磁盘数据,以及缓存对磁盘文件中数据的修改,缓存redo log(innodb才有),维护所有进程、线程需要访问的内部数据结构。
后台线程的作用是刷新内存池中的数据,保证内存池中的数据是最新的,以及把要修改的数据分批定时刷新到磁盘文件中。

二、后台线程

后台线程分为四种:

1.Master Thread :

主要负责把缓存池中的数据异步刷新到磁盘文件中,如合并insert buffer、UNDO页的回收、脏页的刷新等。

2.IO Thread :

有四个IO Thread,为write、read、insert buffer和log IO Thread。Innodb_read_io_threads和Innodb_write_io_threads可以设置线程的数量,默认为4。Innodb中用了大量的AIO(异步IO)来处理写IO请求,而IO Thread用来处理他们的回调。

3.Purge Thread :

用来回收已经使用并分配的undo页,innodb1.1之前是由Master Thread完成,1.1之后可以转为用Purge Thread完成回收,可以通过innodb_purge_threads=1启用,提高CPU的使用率还有存储引擎的性能,1.2开始支持设置多个Purge Thread,加快对undo页的回收,进一步利用磁盘的随机读取性能。

4.Page Cleaner Thread

从innodb1.2开始引入,可以把脏页的刷新从Master Thread的工作中分出来做,提高innodb的性能。

三、内存 1. 缓存池

缓存池用来弥补CPU与磁盘之间速度的鸿沟,在数据库读取页时,会把磁盘中的页读到缓存池中,下次读到相同的页时,会先判断该页是否存在缓存池中,如果有就可以直接从缓存池中拿,不用到磁盘中读。对数据库进行修改 *** 作时,会先修改在缓存池中对应的页,再定时刷到磁盘上(通过checkpoint机制)。

缓存池包括:数据页,索引页,自适应哈希索引,insert buffer、锁信息、数据字典信息、undo页。

Show engine innodb status:查看每个缓存池实例对象运行状态。
2. LRU List、Free List、Flush List

数据库的缓存池是通过LRU算法来管理页的,最近最频繁使用的页会在LRU列表前端(热端),当缓存池没办法存放新的读取到的页时,会释放LRU列表的尾端的页,InnoDB对传统的LRU算法做了优化,加入了midpoint位置,在读取到新的页时,会把新页放入这个位置,这个位置默认为列表的5/8处,可以通过参数innodb_old_blocks_pct调整,如果设置为37,则表示midpoint的位置距离尾端37%,midpoint之后的列表为old列表,midpoint之前的列表为new列表。
设置midpoint的好处:在读取很多页时,而通常只是这次查询会需要访问这么多的时候,不会把LRU列表中所有的页都释放了。

Innodb_old_block_time:用于表示页读取到midpoint后等待多久加入到热端

当数据库刚启动时,此时页都在Free列表中,当读取页时,会从Free列表中分页到LRU列表中,自适应哈希索引等也会在Free列表取页,但是不用LRU算法进行维护,所以不存在于LRU列表。当Free列表没有空闲页了,继续读取页,就会根据LRU算法,把页添加到midpoint的位置,当页从old部分加入到new部分时,发生的 *** 作为page made young。
InnoDB存储引擎从1.0x版本开始支持压缩页,就是把原来大小为16KB的页压缩为1KB、2KB、4KB和8KB。压缩后的页存储到LRU中的unzip_LRU列表中。

LRU列中数据被修改后,产生脏页。数据库通过checkpoint机制将脏页刷新会磁盘,Flush列表中的页即为脏页列表。脏页存在于LRU列表中,也存在于Flush列表中。LRU列表用于管理缓冲池中页的可用性,Flush列表用于将页刷新回磁盘。

3.重做日志缓冲:

InnoDB中除了缓存池之外,还有重做日志缓冲(redo log buffer)。

innodb_log_buffer_size:用于控制缓冲大小。

下面3种情况会把重做日志缓冲中的数据刷新到外部磁盘中的重做日志文件中:
a.Master Thread每一秒把redo log buffer刷到重做日志文件;
b.当redo log buffer的剩余空间小于二分之一时把redo log buffer刷到重做日志文件;
c.每个事物提交时把redo log buffer刷到重做日志文件。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5671528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存