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。
刷新頁時判斷相鄰頁是否也是髒頁。