InnoDB的關鍵特性:
- 插入緩沖(insert buffer)
- 兩次寫(double write)
- 自適應哈希索引(Adaptive Hash Index)
- 異步IO(AIO)
- 刷新臨接頁(Flush Neighbor Page)
插入緩沖
Insert Buffer
InnoDB存儲引擎中,主鍵是行唯一的標識符,通常應用程序插入行記錄是順序的,所以插入聚集索引一般也是順序的。
表中的非聚集索引(輔助索引)在進行插入的時候,數據頁的存放還按照主鍵進行順序存放,但是對於非聚集索引葉子結點的插入就不在是順序的,這時候需要離散的訪問非聚集索引,由於隨機讀取的存在而導致了插入操作的性能下降。(在一般情況下輔助索引是比較順序的)。
InnoDB設計了Insert Buffer,對於非聚集索引的插入或者更新操作,不是每一次直接插入到索引頁中,而是先判斷插入的非聚集索引頁是否在緩沖池中,如果在直接插入,如果不在,則先放入到一個Insert Buffer對象中。然后再以一定的頻率和情況進行Insert Buffer和輔助索引葉子節點的Merge(合並)操作,通常能將多個插入緩沖合並到一個操作中(因為在一個索引頁中),這就大大提高了非聚集索引插入的性能。
使用Insert Buffer需要滿足的條件:1.索引是輔助索引;2.索引不是unique索引
Change Buffer
1.0以后的版本引入了Change Buffer,對數據庫DML操作(insert,update,delete)都進行緩沖。分別是Insert Buffer、Delete Buffer、Purge Buffer
使用的滿足要求依然是輔助索引且不唯一。
對一條記錄的Update操作分為兩個過程:
- 將記錄標記為已刪除
- 真正的記錄刪除
Merge Insert Buffer
將insert buffer進行合並到真正的索引頁的情況發生在如下:
- 輔助索引頁被讀取到緩沖池中;
- Insert Buffer Bitmap頁追蹤到該輔助索引頁已經沒有可用空間;
- Master Thread執行
兩次寫
double write帶給InnoDB存儲引擎的是數據頁的可靠性。
double write由兩部分組成,一部分是內存中的doublewrite buffer,另一部分是物理磁盤上共享表空間中連續128個頁,即2個區。兩者大小都為2MB。在對緩存池的臟頁進行刷新的時候,並不是直接寫入到磁盤,而是先將臟頁復制到內存中的doublewrite buffer中,之后通過doublewrite buffer分兩次,每次1MB順序的寫入共享表空間的物理磁盤上,然后在同步回磁盤,避免了緩沖帶來的問題。由於寫入是順序的寫入,所以開銷不是很大。完成doublewrite后,在將doublewrite buffer中的頁寫入各個表空間文件中。
自適應哈希索引
哈希是一種非常快的查詢方法,時間復雜度O(1)。B+樹的查找次數取決於樹高,樹高多少層,一般需要查詢多少次。
InnoDB存儲引擎回監控對表上各索引頁的查詢。如果觀察到建立哈希索引能夠對性能進行提升,則會建立哈希索引,稱之為自適應哈希索引。
異步IO
為了提高磁盤操作性能,當前的數據庫系統都采用AIO進行磁盤處理。
刷新臨接頁
工作原理是:當刷新一個臟頁的時候,InnoDB存儲引擎會檢測該頁所在區的所有頁,如果是臟頁,那么一起刷新。好處是通過AIO可以多個IO寫入操作合並成一個IO操作,提高了效率。
1.2版本之后通過參數innodb_flush_neighbors來控制是否啟動該特性。