innodb關鍵特性
插入緩沖(insert buffer)
兩次寫(Double write)
自适應哈希索引(adaptive hash index)
異步io(Async IO)
重新整理領接頁(Flush Neighbor Page)
1.插入緩沖
使用場景,即非唯一輔助索引的插入操作,因為不是順序的,是以将這些插入操作,
存到插入緩沖中去,然後一段時間統一插入到真的索引中去,此時很有可能有幾條 插入合并操作,
因為他們是對同一索引頁進行的操作,這樣就大大提高了效率。
關鍵就是将一些 離散的操作,緩存起來,然後找到一些對同一個索引頁 進行 操作的 操作項 進行合并,這樣提高了 效率。
2.兩次寫
提高了 資料頁的可靠性。
在應用(apply)重做日志前,使用者需要一個頁的副本,當寫入失效發生時,先通過頁的副本來還原該頁,再進行重做,這就是duble write 。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB1keBRlT1UEVPpHOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3EDN3IjNzEDM5AzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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