Mysql的InnoDB引擎-4.InnoDB特性


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來控制是否啟動該特性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM