天天看點

(轉載)innodb關鍵特性

innodb關鍵特性

插入緩沖(insert buffer)

兩次寫(Double write)

自适應哈希索引(adaptive hash index)

異步io(Async IO)

重新整理領接頁(Flush Neighbor Page)

1.插入緩沖

使用場景,即非唯一輔助索引的插入操作,因為不是順序的,是以将這些插入操作,

存到插入緩沖中去,然後一段時間統一插入到真的索引中去,此時很有可能有幾條 插入合并操作,

因為他們是對同一索引頁進行的操作,這樣就大大提高了效率。

關鍵就是将一些 離散的操作,緩存起來,然後找到一些對同一個索引頁 進行 操作的 操作項 進行合并,這樣提高了 效率。

2.兩次寫

提高了 資料頁的可靠性。

在應用(apply)重做日志前,使用者需要一個頁的副本,當寫入失效發生時,先通過頁的副本來還原該頁,再進行重做,這就是duble write 。

(轉載)innodb關鍵特性

dublewrite組成

記憶體中的dublewrite buffer,大小2M,

實體磁盤上共享表空間中連續的128個頁,即2個區(extend),大小同樣為2M。

對緩沖池的髒頁進行重新整理時,不是直接寫磁盤,而是會通過memcpy()函數将髒頁先複制到記憶體中的doublewrite buffer,

之後通過doublewrite 再分兩次,每次1M順序地寫入共享表空間的實體磁盤上,在這個過程中,因為doublewrite頁是連續的,

是以這個過程是順序寫的,開銷并不是很大。在完成doublewrite頁的寫入後,再将doublewrite buffer 中的頁寫入各個 表空間檔案中,

此時的寫入則是離散的。如果作業系統在将頁寫入磁盤的過程中發生了崩潰,在恢複過程中,innodb可以從共享表空間中的doublewrite

中找到該頁的一個副本,将其複制到表空間檔案,再應用重做日志。

3.自适應哈希索引

哈希(hash)是一種非常快的查找方法,在一般情況下這種查找的時間複雜度為O(1),即一般僅需要一次查找就能定位資料。

而B+樹的查找次數,取決于B+樹的高度,在生成環境中,B+樹的高度一般3-4層,故需要3-4次的查詢。

innodb會監控對表上個索引頁的查詢。如果觀察到建立哈希索引可以帶來速度提升,則建立哈希索引,稱之為自适應哈希索引(Adaptive Hash Index,AHI)。

AHI有一個要求,就是對這個頁的連續通路模式必須是一樣的。

例如對于(a,b)通路模式情況:

where a = xxx

where a = xxx and b = xxx

通路模式一樣指的是查詢的條件一樣,若交替進行上述兩種查詢,那麼innodb不會對該頁構造AHI,此外AHI還有如下的要求:

以該模式通路了100次

頁通過該模式通路了N次,其中N=頁中記錄*1/16;

AHI啟動後,讀寫速度提高了2倍,輔助索引的連接配接操作性能可以提高5倍。

AHI,是資料庫自動優化的,DBA隻需要指導開發人員去盡量使用符合AHI條件的查詢,以提高效率。

4.異步IO

sync IO :同步IO 即每進行一次IO操作,此次操作結束才能繼續接下來的操作。

但是如果使用者發需要等待出一條索引掃描的查詢,那麼這條SQL查詢語句可能需要掃描多個索引頁,

也就是需要進行多次的IO操作。在每掃描一個頁并等待期完成再進行下一次的掃描是沒有必要的。

異步IO:

使用者可以在發出一個IO請求後立即再發出另一個IO請求,當全部IO請求發送完畢後,等待所有IO操作的完成,這就是AIO。

AIO另一個優勢可以将多個IO,合并為1個IO,以提高IO效率。例如:

使用者需要通路3頁内容,但這3頁時連續的。同步IO需要進行3次IO,而AIO隻需要一次 就可以了。

使用AIO的恢複速度 提高了75%

5.重新整理領接頁

工作原理:

當重新整理一個髒頁時,innodb會檢測該頁所在區(extent)的所有頁,如果是髒頁,那麼一起進行重新整理。

這樣做,通過AIO将多個IO寫入操作合并為一個IO操作。在傳統機械磁盤下有着顯著優勢。

innodb_flush_neighbors 參數來控制是否開啟。

轉載參考自 https://www.cnblogs.com/Aiapple/p/5689634.html

繼續閱讀