INNODB 關鍵特性

InnoDB關鍵特性包括:

插入緩衝(Insert BUffer),兩次寫(Double Write),自適應哈希索引(Adaptive Hash Index),

異步IO(Async IO),刷新鄰接頁(Flush Neighbor Page)

INSERT BUFFER 可能是INNODB 存儲引擎關鍵特性中最令人激動與興奮的一個功能。INSERT

BUFFER和數據頁一樣,也是物理頁的一個組成部分。

插入緩衝被開創性地用於解決這個問題:對於非聚集索引的插入或更新,並不是每次直接插入索引頁,先判斷這個索引頁是否在緩衝池,惹在,則直接插入,惹不在,則先放在插入緩衝,再以一定頻率執行插入緩衝和非聚集索引頁子節點的合併操作(merge),大大提升性能。

插入緩衝的必備條件:NON UNIQUE,SECONDARY INDEX.

Change Buffer 可將其視爲Insert Buffer的升級,InnoDB 存儲引擎可以對DML操作---INSERT、UPDATE、DELETE 都進行緩衝,分別是:Insert Buffer、Delete Buffer、Purge Buffer.

對一條記錄進行UPDATE的操作可能分爲兩個過程:

(1)將記錄標記爲已刪除;(2)真正將記錄刪除。

而PURGE BUFFER對應UPDATE操作的第二個過程,即將記錄真正的刪除。

同時INNODB存儲引擎提供了參數INNODB_change_buffering,用來開啓各種BUFFER的選項。該參數可選的值爲:INSERTS,DELETES,PURGES,CHANGES,ALL,NONE.

兩次寫 (Doublewrite)

如果說 INSERT BUFFER 帶給INNODB 存儲引擎的性能上的提升,那麼DOUBLEWRITE 帶給INNODB存儲引擎的是數據頁的可靠性。這是因爲,當數據庫宕機是,InnoDB存儲引擎可能正在寫入某個頁到表中,而這個時候只寫了一部分(如16K的頁,只寫了前4K),這情況被稱爲部分寫失效(partial page write)。可能你會想着用重做日誌進行恢復。這是一個辦法。但是重做日誌記錄的是對頁的物理操作,如偏移量800,寫"aaaa'記錄。如果這個頁本身已經發生啦損壞,在對其進行重做是沒有意思的。這就是在應用重做日誌前,需要一個頁的副本,當寫入失效時,先通過頁的副本來還原該頁,再進行重做。

DOUBLE WRITE 由兩部分組成 一部分是內存中的DOUBLEWRITE BUFFER,大小爲2MB,另一部分是物理磁盤上共享表空間中連續的128個頁,即2個區,大小同樣是2MB.

自適應哈希索引

      哈希是一種非常快的查找方法,在一般情況下這種查找的時間複雜度爲0(1)。而B+樹的查找次數,取決於B+樹的高度,在生成環境中,B+樹的高度一般爲3-4層,不需要查詢3-4次。InnoDB存儲引擎會監控對錶上各索引頁的查詢。如果觀察到簡歷哈希索引可以提升速度,這簡歷哈希索引,稱之爲自適應哈希索引(Adaptive Hash Index, AHI)。AHI是通過緩衝池的B+樹頁構造而來的。因此建立的速度非常快,且不要對整張表構建哈希索引。InnoDB存儲喲inquiry會自動根據房屋的頻率和陌生來自動的爲某些熱點頁建立哈希索引。

異步IO (Asy IO)

系統都採用異步IO(AIO)。在InnoDB 1.1.x之前,AIO的實現是通過InnoDB存儲引擎中的代碼來模擬的。但是從這之後,提供了內核級別的AIO的支持,稱爲Native AIO。Native AIO需要操作系統提供支持。Windows和Linux都支持,而Mac則未提供。在選擇MySQL數據庫服務器的操作系統時,需要考慮這方面的因素。MySQL可以通過參數innodb_use_native_aio來決定是否啓用Native AIO。在InnoDB存儲引擎中,read ahead方式的讀取都是通過AIO完成,髒頁的刷新,也是通過AIO完成。

刷新鄰接頁
InnoDB存儲引擎在刷新一個髒頁時,會檢測該頁所在區(extent)的所有頁,如果是髒頁,那麼一起刷新。這樣做的好處是通過AIO可以將多個IO寫操作合併爲一個IO操作。該工作機制在傳統機械磁盤下有顯著優勢。但是需要考慮下吧兩個問題:a.是不是將不怎麼髒的頁進行寫入,而該頁之後又會很快變成髒頁?b.固態硬盤有很高IOPS,是否還需要這個特性?爲此InnoDB存儲引擎1.2.x版本開始提供參數innodb_flush_neighbors來決定是否啓用。對於傳統機械硬盤建議使用,而對於固態硬盤可以關閉



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章