緩衝區是主記憶體中儲存訪問的表和索引的區域。緩衝池允許經常訪問的資料直接從記憶體處理,更加高效。
為了提高大容量讀取操作的效率,緩衝池被劃分為可以容納多行資料的頁(page)。為了高效管理快取,緩衝池被實現為頁(page)的列表,快取刪除用lru演算法的變種實現。
下圖為緩衝池的結構:
head部儲存的是最近訪問的資料,tail部是最近最少訪問的。
預設情況下,3/8的緩衝池用作old sublist。
當innodb讀取乙個頁到緩衝池,首先插入到old sublist的頭部,頁中的資料被讀取可能是使用者訪問(如sql查詢)或者innodb自動執行的預處理,訪問old sublist中的資料會使它變「young」,移動它到new sublist的頭部。如果頁因為使用者訪問被讀取,則立即進行第一次訪問,並且頁面變「young」。如果是因為預讀取,第一次訪問不會發生,並且可能永遠不會發生(直到被丟棄),這樣可以防止掃瞄表或者索引的時候沖掉緩衝池中的熱資料,因為掃瞄的資料隨後可能永遠都不會訪問。
隨著資料庫操作,緩衝池中不被訪問的頁會變老(age)並移向表尾。當其他的資料變新(new)的時候,new sublist和old sublist都會變老。old sublist中的頁會因為在緩衝池中間(new sublist和old sublist交界處)插入頁而變老。最終持續不用的頁會到達鍊錶結尾然後被丟棄。
innoDB原始碼分析 緩衝池
最開始學oracle的時候,有個概念叫sga和pga,是非常重要的概念,其實就是記憶體中的緩衝池。innodb的設計類似於oracle,也會在記憶體中開闢一片緩衝池。眾所周知,cpu的速度和磁碟的io速度相差可以用鴻溝來形容,因此聰明的前輩們使用了記憶體這個rom來彌補這道鴻溝,那麼資料庫的設計者們...
InnoDB緩衝池初始化
innodb作為mysql的乙個儲存引擎外掛程式,在啟動mysql資料庫例項時,會呼叫外掛程式提供的初始化函式,innodb啟動時的入口函式是innobase init mysql declare plugin innobase 緩衝池初始化通過函式buf pool init來完成。mysql支援將...
InnoDB儲存引擎 記憶體 緩衝池
innodb儲存引擎是基於磁碟儲存的,並將其記錄按照頁的方式進行管理.而磁碟io與記憶體io的速度相差可能接近1000倍,所以使用緩衝池 buffer pool 可以有效提高響應能力.當資料庫需要進行資料頁讀取的時候,先將頁資料儲存在緩衝池中,下一次再讀取的時候,先檢查緩衝池中是否存在資料,如果存在...