InnoDB儲存引擎中的緩衝池管理1

2021-08-15 15:45:05 字數 1583 閱讀 1865

innodb儲存引擎是基於磁碟儲存的,為了平衡cpu速度和磁碟速度之間的差距,引入了緩衝池。即通過一塊記憶體區域來彌補磁碟速度較慢對資料庫效能的影響。

緩衝池是乙個比較大的記憶體區域,其中存放了各種型別的頁。那麼innodb儲存引擎是如何對這塊較大的記憶體進行管理的呢?

下面介紹幾類演算法。

通常來說,資料庫中的緩衝池是通過lru(latest recent used,最近最少使用)演算法來進行管理的。

最頻繁使用的頁放在lru 列表的前端,而最少使用的頁在lru列表的尾端。當緩衝池不能存放新讀取的頁時,將首先釋放lru列表的尾端的頁。

在innodb儲存引擎中,緩衝池中頁的大小預設為16kb,也是使用lru的演算法進行管理,但稍有改進。

先介紹改進的lru演算法, 再來分析一下為何要這麼做。

演算法介紹

lru列表加入了midpoint位置。新讀取到的頁,雖然是最新訪問的頁,但並不是直接放入到lru列表的首部,而是放在lru列表的midpoint位置。這個演算法稱為midpoint insertion strategy。預設情況下,該位置在lru列表長度的5/8處。

通過命令show variables like 『innodb_old_blocks_pct』來檢視midpoint位置

由上圖可知,預設值是37,表示新讀取的頁插入到lru列表尾端的37%的位置(約3/8)。

把midpoint之後的列表稱為old列表,之前的列表稱為new列表。new列表中的頁都是最為活躍的熱點資料。

改進的原因

比如有一張資料量較大的表student

select * from student;

查詢所有學生資訊這類的操作很少,但偶爾還是有。這類操作我們需要訪問表中的很多的頁,但這些頁只有在這次查詢操作中才需要,並不是活躍的熱點資料。如果我們把這些查出的頁直接放在lru列表的首部,則很有可能將所需要的熱點資料頁從lru列表中移除,而下一次需要訪問熱點資料頁時,innodb儲存引擎需要再次訪問磁碟,降低效能。

為了解決上述問題,innodb儲存引擎引入了另乙個引數innodb_old_blocks_time來進一步管理lru列表。

innodb_old_blocks_time

表示頁讀取到mid位置後需要等待多久才會被加入到new端

通過命令set global innodb_old_blocks_time=*

進行設定,來使lru列表中資料不被刷出

lru列表是用來管理已經讀取的頁,但當資料庫啟動時,lru列表是空的,還沒有任何的頁。這時頁都存放在free列表中。當需要從緩衝池中分頁時,首先從free列表中查詢是否有可用的空閒頁,若有則將該頁從free列表中刪除,放入到lru列表中。否則,根據lru演算法,淘汰lru列表尾端的頁,將該記憶體空間分配給新的頁。當頁從lru列表的old部分加入到new部分時,稱此時發生的操作為page made young,而因為innodb_old_blocks_time的設定而導致頁沒有從old部分移動到new部分的操作成為page not made young。

InnoDB儲存引擎 記憶體 緩衝池

innodb儲存引擎是基於磁碟儲存的,並將其記錄按照頁的方式進行管理.而磁碟io與記憶體io的速度相差可能接近1000倍,所以使用緩衝池 buffer pool 可以有效提高響應能力.當資料庫需要進行資料頁讀取的時候,先將頁資料儲存在緩衝池中,下一次再讀取的時候,先檢查緩衝池中是否存在資料,如果存在...

innodb的緩衝池(buffer pool)

緩衝區是主記憶體中儲存訪問的表和索引的區域。緩衝池允許經常訪問的資料直接從記憶體處理,更加高效。為了提高大容量讀取操作的效率,緩衝池被劃分為可以容納多行資料的頁 page 為了高效管理快取,緩衝池被實現為頁 page 的列表,快取刪除用lru演算法的變種實現。下圖為緩衝池的結構 head部儲存的是最...

InnoDB 儲存引擎

innodb是事務型資料庫的首選引擎,支援事務安全表 acid 支援行鎖定和外來鍵。mysql 5.5.5 之後,innodb作為預設儲存引擎。innodb的主要特性有一下幾項。a.innodb給mysql提供了具有提交 回滾和崩潰恢復能力的事務安全 acid相容 儲存引擎。innodb鎖定在行級並...