后台线程
作用
刷新内存池数据,保证内存缓存的是最新的数据,将已修改的数据文件刷新到磁盘中,数据库发生异常时InnoDB能恢复至正常运行状态.
Master Thread
负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲,UNDO页的回收.
IO Thread
Async IO处理IO请求,四种Thread: write, read, insert buffer, log IO thread, 可设置: innodb_read_io_threads, innodb_write_io_threads
Purge Thread
来回收已经使用并分配的undo页.
Page Cleaner Thread
脏页刷新的操作放在该线程中执行.
内存
缓冲池
缓冲池大小可配: innodb_buffer_pool_size
缓冲池个数可配: innodb_buffer_pool_instances
LRU List, Free List, Flush List
改进LRU算法,该算法为midpoint insertion strategy,默认midpoint的位于列表的5/8处,该位置可以通过innodb_old_blocks_pct控制.
参数innodb_old_blocks_time表示页读取到mid位置后需要等待多久才会被加入到LRU的热端.
脏页既存在于LRU list, Flush list中,LUR列表是用来管理页列表的可用性,而Flush列表是用来管理将页刷新回磁盘,两者互不影响.
重做日志缓冲池:可配置参数innodb_log_buffer_size,默认为8MB,以下三种将缓存池内容刷新到磁盘中的情况:
1) Master Thread每一秒将重做日志缓冲刷新到重做日志中;
2) 每个事务提交时会将重做日志缓冲刷新到重做日志中;
3) 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志中.
Checkpoint技术
两种Checkpoint: Sharp Checkpoint(数据库关闭时将所有脏页刷新会磁盘), Fuzzy Checkpoint.
Fuzzy Checkpoint有以下几种:
Master Thread Checkpoint
FULSH_LRU_LIST Checkpoint
Async/Sync Flush Checkpoint
Dirty Page too much Checkpoint
Master Thread的工作方式
内部分为多个loop: loop, background loop, flush loop, suspend loop;
loop
每秒操作:
日志缓冲刷新到磁盘,即使这个事务还没有提交(总是);
合并插入缓冲(可能);
至多刷新100个脏页到磁盘(可能);
若当前无用户活动,切换到background loop.
每10秒操作:
刷新100个脏页到磁盘;(可能)
合并至多5个插入缓冲;(总是)
将日志缓冲刷新到磁盘;(总是)
删除无用的undo页;(总是)
刷新100个或10个脏页到磁盘(总是).
background loop
删除无用的undo页(总是);
合并20个插入缓冲(总是);
跳出主循环(总是);
不断刷新100个页直到符合条件(可能,跳转到flush loop完成).
1.2.x前增加可选项
innodb_io_capacity
innodb_max_dirty_pages_pct
innodb_adaptive_flushing
innodb_purge_batch_size
1.2.x后改进
Master Thread伪代码:
从Master Thread中分离出刷新脏页的操作至一个单独的Page Cleaner Thread.
InnoDB关键特性
Insert Buffer
适用对象: 非唯一的辅助索引
内部实现: B+树
Insert/Change Buffer
Double Write
Adaptive Hash Index(AHI)
AHI有一个要求:对这个页的连续访问模式必须是一样的
Async IO
Flush Neighbor Page