一 前言
在 MySQL的insert操作中,涉及到的需要insert 的 page有聚簇索引page,唯一索引page,以及非唯一索引page 。正常情況下,
對(duì)于 聚簇索引( 自增作為主鍵 )的insert來(lái)說(shuō)是一個(gè)順序 io的操作,所以效率很好,當(dāng)然,綁定主鍵的插入也是一個(gè)隨機(jī)的,但這種情況比較少。
然而,對(duì)于非唯一的二級(jí)索引來(lái)說(shuō),絕大部分的插入是隨機(jī)的IO過(guò)程,對(duì)于mysql來(lái)說(shuō),隨機(jī)io的開銷還是相對(duì)比較大的,InnoDB為此專門做了一項(xiàng)工作,那就是insert buffer
二 Insert BUFFER
1> insert buffer 是 BP當(dāng)中有一塊內(nèi)存區(qū)域,并且和數(shù)據(jù)頁(yè)一樣,也有自己的物理頁(yè)。
2> insert buffer bitmap存儲(chǔ)著所有頁(yè)的相關(guān)信息,每個(gè)頁(yè)信息占用4字節(jié)。故一個(gè)bitmap頁(yè)可以管理16384個(gè)頁(yè),之后再一個(gè)bitmap管理之后的page,以此類推
1. 該頁(yè)的剩余空間比例,2字節(jié)
2. 該頁(yè)是否有被緩存到insert buffer B+Tree中,1字節(jié)
3. 該頁(yè)是否為索引頁(yè),1字節(jié)
insert bitmap存儲(chǔ)在 系統(tǒng)表空間當(dāng)中。
構(gòu)造過(guò)程:
1 . 非唯一的二級(jí)索引頁(yè) 的insert 操作,先判斷該頁(yè)是否在BP中,若不在,則 通過(guò)sapce offset構(gòu)造search key ,并且通過(guò)該key將該頁(yè)放到 insert buffer B+Tree中。
2 若在,則直接插入該頁(yè)。
Merge過(guò)程:
1. select/update/delete操作若需要讀取輔助索引頁(yè),則先在bitmap page中檢查insert buffer b+Tree中是否有該頁(yè),若有改頁(yè),則先從insert buffer B+TRee讀取該頁(yè)merge到該輔助索引頁(yè)中。
2. 對(duì)于insert 操作,若該輔助索引頁(yè)不在BP中,則先檢測(cè) bitmap 頁(yè)判斷插入該 索引記錄之后 該輔助索引頁(yè)的空間是否小于1/32 頁(yè)大小,若小于1/32,則強(qiáng)制讀取該索引頁(yè),即進(jìn)行 上面(1) 的操作,若不小于則直接插入到insert buffer中。
3. Master Thread 每隔1s 或者 10s會(huì)有insert buffer 的merge的相關(guān)操作,隨機(jī)一個(gè)insert buffer B+Tree的位置然后順序merge N個(gè)page。
參考:
《MySQL技術(shù)內(nèi)幕:InnoDB存儲(chǔ)引擎》
標(biāo)題名稱:#MySQL#INNODB存儲(chǔ)引擎之插入緩沖
當(dāng)前路徑:
http://weahome.cn/article/pigoes.html