【Mysql技術內幕】第2章 InnoDB存儲引擎

2.6 InnoDB關鍵特性

  • 插入緩衝
  • 兩次寫
  • 自適應哈希索引
  • 異步IO
  • 刷新鄰接頁

2.6.1 插入緩衝

    一般應用程序中行記錄的插入順序是按照主鍵的遞增順序進行插入的,所以插入彙集索引(Primary Key)通常是順序的,不須要磁盤的隨機讀取,可是對於非彙集非惟一的索引的插入再也不是順序的,因爲隨機讀取的存在致使了插入的性能降低。linux

    因而開創了Insert Buffer , 對於非彙集索引的插入和更新操做並非每一次都插入到索引頁中, 而是先判斷非彙集索引頁是否在緩衝池中,若在,則直接插入;若不在,則先放到一個Insert Buffer對象中,而後以必定的頻率進行Insert Buffer和輔助索引子節點的merge操做,這樣多個插入操做就合併成爲了一個操做(由於在一個索引頁中) 大大提升了非彙集索引的插入性能。ios

    Insert Buffer 內部實現是一個B+樹,Mysql4.1 一張表就有一顆Insert Buffer B+樹,如今是全局就一顆Insert Buffer B+樹。非葉子節點存儲的是Search Key,葉子節點是各字段數據記錄。sql

  • 非葉子節點: space+marker+offset
  • 葉子節點:space+marker+offset+metadata+secondary index recored\

2.6.2 兩次寫

    double write 提高了innodb的穩定性,未使用兩次寫技術以前,出現過部分寫失敗而丟失數據的狀況,即innodb正在寫某個頁到列表中,這個頁只寫了一部分,就發生了宕機。此時經過redo日誌也沒法挽救,由於這個頁自己已經損壞了,重作毫無心義。正確的作法是,須要一個頁的副本,當寫入失敗的時候,先經過備份的頁來還原該頁,而後在用redo進行重作,這就是double write .異步

    double write 一共有兩部分組成,一部分是內存中的double write buffer , 另外一部分是物理磁盤上的共享表空間裏面128個連續的頁,大小都爲2MB。寫入方法爲:刷新髒頁時,並不直接寫磁盤,經過memcpy函數複製到double write buffer中,而後double write buffer再分兩次,每次1MB寫入到共享表空間的物理磁盤上,double write 頁是連續的,因此性能較高。函數

2.6.3 自適應哈希索引

    哈希是一種很是快的查找方法,通常狀況下查找的時間複雜度爲O(1) , 而B+的查找次數取決於B+樹的高度,在生產環境中,B+樹通常3~4層。性能

InnoDB會監控各表索引頁的查詢狀況,自動創建哈希索引,因此稱爲自適應哈希索引(AHI), AHI經過緩衝池的B+樹頁構造層,創建速度很快。spa

可是AHI要求連續,好比日誌

    where a=xxx對象

    where a=xxx and b=xxx索引

    連續出現會建立, 交替出現不會建立AHI

2.6.4 異步IO

    好比一個用戶發出一條索引掃描的查詢,涉及到掃描多個索引頁,也就是須要進行屢次的IO操做,等一個頁掃描完成再進行下一個是很是不明智的。所有IO請求發送完成後,等待IO的結果,這是AIO。AIO還能夠將多個IO操做合併爲一個,能夠提升IOPS的性能。linux上能夠經過iostat命令查看當前的IO狀況

2.6.5 刷新鄰接頁

    當刷新一個髒頁的時候,innodb引擎會檢測該頁所在區(ext)的全部頁,若是有髒頁,就一塊兒刷新。並經過AIO將多個IO合併爲一個IO。

相關文章
相關標籤/搜索