天天看點

《DBNotes: Buffer Pool對于緩沖頁的連結清單式管理》

目錄

  • ​​Buffer Pool回顧​​
  • ​​Buffer Pool内部組成​​
  • ​​freelist​​
  • ​​flushlist​​
  • ​​LRU連結清單管理以及改進​​

Buffer Pool回顧

我們知道針對資料庫的增删改删操作都是在Buffer Pool中完成的,一條sql的執行步驟可以認為是這樣的:

1、innodb存儲引擎首先在緩沖池中查詢有沒有對應的資料,有就直接傳回

2、如果不存在,則去磁盤進行加載,并加入緩沖池

3、同時該記錄會被加上獨占鎖,防止多人修改,出現資料不一緻

而且我們知道,可以通過設定​

​my.cnf​

​​配置中的​

​innodb_buffer_pool_size​

​來修改緩沖池大小,加快sql查詢速度,當然也需要注意設定過大會造成系統swap空間被占用,導緻系統變慢降低查詢性能。

Buffer Pool内部組成

緩沖池對應一片連續記憶體,我們将其劃分為大小為16kb的頁(與innodb對應),這些頁稱為緩沖頁。

為了很好的管理這些頁,設計者為每個緩沖頁都建立了一些控制資訊:表空間編号、頁号、緩沖頁在緩沖池中的位址、連結清單節點資訊等。将每個頁對應的控制資訊占用的一塊記憶體稱為一個控制塊。控制塊與緩沖頁一一對應,都存放在緩沖池中。

在Mysql啟動時,會自己完成對緩沖池的初始化:向作業系統申請記憶體,自己劃分成若幹對控制塊和緩沖頁。

freelist

當我們從磁盤中load一個資料頁到緩沖池中,我們應該放到哪個緩沖頁中呢?

很顯然我們應該把資料頁放到“空閑”的緩沖頁中。

設計者将所有空閑的緩沖頁對應的控制塊作為一個節點放到一個連結清單中,稱為freelist。每次從freelist中取出一個空閑的緩沖頁中,并且将該緩沖頁對應的控制塊資訊填上,然後将該節點移除,表示緩沖頁已經被使用了

flushlist

LRU連結清單管理以及改進