【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
-