redo log先都写入该buffer,然后按必定频率刷新到磁盘(1s/次),默认8M。其刷到磁盘主要一下几个状况:php
对一些数据结构自己的内存分配是从额外内存池分配。html
负责将缓存池中的数据异步刷新到磁盘,包括脏页。合并插入缓存(INSERT BUFFER)、UNDO页的回收等。前端
Innodb中大量使用AIO处理写请求,IO Thread则主要处理这些请求的回调,包括write、read、insert buffer和log IO Thread。linux
主要用来回收undo log,Innodb1.1以前由Master Thread负责。算法
清理已提交事物的UNDO log。数据库
事务型数据库通常采用Write Ahead Log策略,当事物提交时先写redo log然后修改内存中的页。当数据库宕机对于还未写入磁盘的修改数据能够经过redo log恢复。Checkpoint做用在于保证该点以前的全部修改的页均已刷新到磁盘,这以前的redo log在恢复数据时能够不须要了。windows
发生在数据库关闭时,将全部脏页写入磁盘,数据库运行时通常不使用。缓存
只刷新部分部分脏页。数据结构
主要包括主loop、background loop、flush loop和suspend loop。其中的参数能够配置。异步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
while
(
true
){
//差很少1s一次
for
(
int
i
in
0..9){
刷新日志缓存到磁盘
//1s内的统计值
if
IO < 5
合并插入缓存
if
脏页比例 > 预约值
刷新部分脏页(不超过100)
if
没有用户活动
进入background loop{
删除无用undo页
合并20个插入缓冲
可能跳到flush loop{
可能跳到suspend loop
}
跳回主loop
}
sleep 1s;
}
//差很少10s一次
if
IO < 200
//10s内
刷新100个脏页到磁盘
合并最多5个插入缓冲
刷新日志缓冲
删除无用undo
刷新100或10个脏页
}
|
Master Thread中的脏页刷新功能彻底由Page Cleaner Thread执行。
在对脏页刷新到磁盘时,若是某一页还没写完就宕机,此时该页数据已经混乱没法经过redo实现恢复。innodb提供了doublewrite机制,其刷新脏页步骤以下:
1. 先将脏页数据复制到doublewrite buffer中(2MB内存) 2. 将doublewrite buffer分两次,每次1MB写入到doublewrite磁盘(2MB)中。 3. 立刻同步脏页数据到磁盘。对于数据混乱的页则能够从doublewrite中读取到,该页写到共享表空间。
InnoDB存储引擎会监控对表上索引的查找,若是观察到创建哈希索引能够带来速度的提高,则创建哈希索引,因此称之为自适应(adaptive) 的。自适应哈希索引经过缓冲池的B+树构造而来,所以创建的速度很快。并且不须要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页创建哈希索引。
linux和windows中提供异步IO,其能够对连续的页作合并连续页的IO操做使随机IO变顺序IO。
刷新页时判断相邻页是否也是脏页。