InnoDB存儲引擎內存緩沖池管理技術——LRU List、Free List、Flush List


  InnoDB是事務安全的MySQL存儲引擎,野山谷OLTP應用中核心表的首選存儲引擎。他是基於表的存儲引擎,而不是基於數據庫的。其特點是行鎖設計、支持MVCC、支持外鍵、提供一致性非鎖定讀,同時被設計用來最有效的利用一是使用內存和CPU。

  InnoDB存儲引擎由HeIkki Tuuri(1964年,芬蘭赫爾辛基)。

后台線程:

  Master Thread:核心:異步刷新、一致性;

  IO Thread:AIO 請求回調處理;

  Purge Thread:回收已分配的undo頁;

  Page Cleaner Thread:臟頁刷新。

內存緩沖池:

  首先將從磁盤督導的頁放在緩沖池中,這個過程稱為將頁“FIX”在緩沖池。下次訪問時,若在緩沖池中,則該頁被命中;若不在緩沖池中,讀取磁盤上的頁。修改操作,首先修改緩沖池中的頁,然后再以一定的頻率刷新到磁盤。通過show variables like 'innodb_buffer_pool_size'\G;查看緩沖池大小。

  具體的說緩沖池中緩存的數據頁類型有:索引頁、數據頁、undo頁、茶如緩沖(insert buffer)、自適應哈希索引(adaptive hash index)、InnoDB存儲的鎖信息(lock info)、數據字典信息(data dictionary)等。注意區別與MyISAM存儲引擎。

LRU List——Latest Recent Used(最近最少使用)

  默認大小頁的大小16KB,通過show engine innodb status;可以查看當前緩沖池的頁數。InnoDB對傳統的LRU算法進行了優化。在InnoDB中加入了midpoint。傳統的LRU算法當訪問到的頁不在緩沖區是直接將磁盤頁數據調到緩沖區隊列;而InnoDB並不是直接插入到緩沖區隊列的隊頭,而是插入LRU列表的midpoint位置。這個算法稱之為midpoint insertion stategy。默認配置插入到列表長度的5/8處。midpoint由參數innodb_old_blocks_pct控制。

  midpoint之前的列表稱之為new列表,之后的列表稱之為old列表。可以簡單的將new列表中的頁理解為最為活躍的熱點數據

  好處:不使用朴素的LRU算法。出於效率考慮,因為可能存在類似於“掃表”等偶然操作,這樣做可以避免將熱點數據替換掉,而添加到緩沖區的頁是偶然操作用到的頁。

  然而mid位置的頁不是永久的。為了解決這個問題,InnoDB存儲引擎引入了innodb_old_blocks_time來表示頁讀取到mid位置之后需要等待多久才會被加入到LRU列表的熱端。可以通過設置該參數保證熱點數據不輕易被刷出。

Free List

  數據庫剛啟動的時候,LRU 列表為空,此時需要用到的時候直接將Free列表中的頁刪除,在LRU列表中增加相應的頁,維持頁數守恆。

Flush List  

  當LRU列表中的頁被修改后,稱該頁為臟頁(dirty page),即緩沖池中的頁和磁盤上的頁數據產生了不一致。這時候數據庫會通過checkpoint機制將臟頁刷新回磁盤,而Flush 列表中的頁即為臟頁列表。注意臟頁也存在於LRU列表中。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM