Mysql核心:INNODB儲存引擎--《十一》Insert Buffer

FreeeLinux發表於2017-08-12

11.2基本概念

innodb對於自增主鍵值得插入是順序的,因此插入能有較高的插入效能。但在實際生產環境中,使用者表的主鍵僅有並只能有一個,然後表中可能存在多個輔助索引。輔助索引根據型別在插入時可以分為比較順序到的插入和隨機的插入兩種。比較順序的插入可能是時間欄位,隨機的插入可能更為廣泛。

innodb儲存引擎insert buffer的設計思想是,在插入時首先判斷插入的輔助索引葉子是否還在緩衝池中。若在則直接插入,否則將插入的記錄放到insert buffer中,然後根據一些演算法將insert buffer快取的記錄通過後臺執行緒慢慢的合併回輔助索引頁中。這樣做好處:

  • 減少磁碟的離散讀取
  • 將多次插入合併為一次操作

舉例子,第一列為人名,第二列為page_no(實際上page_no並不是資料,在這裡用來表示頁號):
(‘huangweiyang’, 2), (‘licao’, 10), (‘gaomingxi’, 4), (‘lishuai’, 15), (‘hejiejie’, 2)

後面的列表示原先應插入的輔助索引的page_no,可以看到頁的訪問時無序的。然而當插入到insert buffer中,刪除記錄可能完全在一個頁中,因此減少了李珊讀取。在insert buffer中,,記錄根據應插入輔助索引的葉子節點的page_no進行排序。排序完畢後,上述記錄就會從insert buffer向輔助索引合併,比如(‘huangweiyang’)(‘hejiejie’)此時就可以批量合併了 :)

注意,insert buffer 只能快取非唯一約束的索引。若是唯一索引,那麼在插入時需要判斷插入的記錄是否唯一,這需要讀取輔助索引頁。這不就完蛋了,insert buffer不起作用嘍!

11.3架構實現

11.3.1 儲存結構

不用說,B+樹!鍵值就是待插入到輔助索引頁的page_no。B+樹索引頁的大小一樣為16kb,記憶體同樣使用緩衝池。

innodb儲存引擎存在一個insert buffer bitmap頁,用來追蹤每個快取頁的剩餘空間,當剩餘空間小於某個閾值時,

佔坑

相關文章