MySQL學習筆記(十四) 之 緩衝池介紹

2021-10-19 13:53:05 字數 1430 閱讀 5732

一. buffer pool

老規矩–妹妹鎮樓:

buffer pool被劃分為若干個頁面,頁面大小與innodb表空間使用的頁面大小一致,預設都是16kb,這些頁稱為緩衝頁。為了更好地管理這些緩衝頁,每個緩衝頁都配置了乙個控制塊,儲存著一些控制資訊,如該頁所屬的表空間編號,頁號等等,控制塊和緩衝頁都在緩衝池中,控制塊放在緩衝池的前面,緩衝頁放在緩衝池的後面。

既然緩衝頁是用來快取磁碟的頁面的,那麼有些緩衝頁已經被使用了,有些緩衝頁還沒有使用,我們需要快速找出空閒的緩衝頁,因此將所有空間的緩衝頁對應的控制塊放到乙個free鍊錶中。該鍊錶的基節點中包含了鍊錶的頭節點位址,尾節點位址,以及當前鍊錶中節點的數量,其餘的每個控制塊中包含著鍊錶的前後指標。

如何判斷某個緩衝頁是否存在於緩衝池中?

我們都是通過表空間號+頁號來定位乙個頁的,因此以表空間號+頁號作為乙個雜湊表的key,以緩衝頁控制塊的位址作為value。這樣我們就能夠快速地判斷出某個緩衝頁是否存在於緩衝池中,如果沒有就從free鍊錶中選出乙個空閒的緩衝頁,將磁碟中對應的頁載入到緩衝頁中。

如果我們修改了緩衝池中某個緩衝頁的資料,它就與磁碟上的頁不一致了,這種頁稱為髒頁。如果我們修改一次就重新整理到磁碟一次,效能會受到影響,因此我們選擇將這些髒頁使用鍊錶存起來,稱為flush鍊錶。

1. 簡單的lru

緩衝池的大小是有限的,如果需要快取的頁的大小超過了緩衝池的大小,就會將某些舊的緩衝頁從緩衝池中移除,再將新的頁放進來。為了提高緩衝池的命中率,我們需要淘汰掉最近很少使用的部分緩衝頁,這就需要建立乙個鍊錶,按照最近最少使用的原則淘汰緩衝頁,所以這個鍊錶稱為lru(least recently used)鍊錶。

當需要訪問某個頁時,如果該頁不在緩衝池中,在把該頁從磁碟載入到緩衝池中的緩衝頁時,就把該頁對應的控制塊作為節點塞到lru鍊錶的頭部。這樣,lru鍊錶的尾部就是最近最少使用的緩衝頁了,當緩衝池中的空閒緩衝頁使用完時,淘汰lru鍊錶尾部的一些緩衝頁即可。

2. 劃分區域的lru

有些情況下,簡單的lru反而會造成效能的損耗,如對很大的表進行全表掃瞄時,可能會把緩衝池中的緩衝區都更換一遍,會將使用頻率很高的頁從緩衝池中淘汰掉;又或者載入到緩衝池中的頁不一定用到,都會導致緩衝池命中率降低。

因此,將lru鍊錶劃分為兩部分,一部分儲存使用頻率很高的緩衝頁,稱為熱資料,一部分儲存使用頻率低的緩衝頁,稱為冷資料。兩部分的比例並不是對半分,可以通過查詢系統變數 innodb_old_blocks_pct得知。當磁碟上的某個頁面初次載入到緩衝池中的某個緩衝頁時,該緩衝頁對應的控制塊會放到冷資料區的頭部,不會影響到熱資料區使用頻繁的緩衝頁。如果該緩衝頁第二次被訪問,就將其控制塊移動到熱資料的頭部。對於熱點資料,可能會頻繁訪問,不需要頻繁地移動熱資料的節點到頭部,只有在位於熱資料區域1/4的後面時,才會被移動到lru鍊錶的頭部。

Mysql資料庫緩衝池學習筆記

1 緩衝池概念 緩衝池簡單來說就是一塊記憶體區域,通過記憶體的速度來彌補磁碟速度較慢對資料庫效能的影響。在資料庫當中讀取頁的操作,首先將從磁碟讀到的頁存放在快取池中,這個過程稱為將頁 fix 在緩衝池中。下一次再讀相同的頁時,首先判斷該頁是不是在緩衝池中。若在,直接讀取。否則,讀取磁碟上的頁。2 那...

學習筆記之緩衝流

使用位元組輸入流讀取 乙個乙個傳 使用位元組緩衝輸入流 傳陣列bufferedoutputstream位元組緩衝輸出流 close flush write byte b write byte b,int off,int len abstract void write int b 要flush或者cl...

mysql 資料預熱 mysql預熱緩衝池

在資料庫壓力很大的情況下,重啟完資料庫,通過手工執行下列語句,把熱資料載入到innodb buffer pool緩衝池中進行預熱,從而避免早高峰連線數公升高,程式報錯。select count from user select count from 在mysql5.6裡為了解決上述問題,提供了乙個新...