【MySQL】InnoDB后台线程与内存缓存池

InnoDB有多个内存块组成的内存池,负责如下工作:

  • 维护进程、线程内部数据结构

  • 缓存磁盘上数据

后台线程的作用是刷新内存池中的数据,保证缓冲池中缓存是最新的数据。将已修改的数据文件刷新到磁盘文件。保证在数据库发生异常时可以恢复到正常状态。

后台线程

Master Thread

负责将缓冲池中数据异步刷新到次哦按,保证数据的一致性。

IO Thread

负责处理IO请求的回调处理。分别是write、read、insert buffer和log IO Thread。

Purge Thread

事务被提交之后,undolog不再需要,用这个线程来回收已经使用的undo页。

Page Cleaner Thread

将脏页的刷新放入单独的线程中。

内存

缓冲池

和分页内存比较像,读时复制,修改时在内存中改,以一定频率写回磁盘。

允许有多个缓冲池示例,根据哈希值品均分配到不同的示例中。

用LRU算法管理。新页放到37%的位置。然后但再次读到时如果时间差超过了设置的值,会放到表头。

Checkpoint

  • Sharp Checkpoint 数据库关闭时将所有的脏数据刷新会磁盘。

  • Fuzzy Checkpoint 只刷新一部分脏页

    • Master Thread中发生的Checkpoint,每秒或每十秒刷新一定比例的页回磁盘

    • FLUSH_LRU_LIST,为了保证LRU表中有100个空闲也左右可供使用,将LRU尾部的脏数据进行移除。

    • Async/Sync Flush,在重做日志文件不可用时刷新一些页回磁盘。

    • Dirty Page Too Much

posted @ 2020-04-10 12:17  Ryan_W  阅读(209)  评论(0编辑  收藏  举报