資料庫緩衝池(Buffer Pool)

2022-09-19 17:51:11 字數 2864 閱讀 8070

innodb儲存引擎是以頁為單位來管理儲存空間的,我們進行的增刪改查操作其實本質上都是在訪問頁面(包括讀頁面、寫頁面、建立新頁面等操作)。而磁碟ⅳ/o需要消耗的時間很多,而在記憶體中進行操作,效率則會高很多,為了能讓資料表或者索引中的資料隨時被我們所用,dbms會申請占用記憶體來作為資料緩衝池,在真正訪問頁面之前,需要把在磁碟上的頁快取到記憶體中的buffer pool之後才可以訪問。

這樣做的好處是可以讓磁碟活動最小化,從而減少與磁碟直接進行工/0 的時間。要知道,這種策略對提公升sql語句的查詢效能來說至關重要。如果索引的資料在緩衝池裡,那麼訪問的成本就會降低很多。

緩衝池和查詢快取是乙個東西嗎?不是。

1、緩衝池(buffer pool)

首先我們需要了解在innodb儲存引擎中,緩衝池都包括了哪些。

在innodb儲存引擎中有一部分資料會放到記憶體中,緩衝池則佔了這部分記憶體的大部分,它用來儲存各種資料的快取,如下圖所示:

從圖中,你能看到innodb緩衝池包括了資料頁、索引頁、插入緩衝、鎖資訊、自適應hash 和資料字典資訊等。

快取池的重要性:

對於使用innodb作為儲存引擎的表來說,不管是用於儲存使用者資料的索引(包括聚簇索引和二級索引),還是各種系統資料,都是以的形式存放在表空間中的,而所謂的表空間只不過是innodb對檔案系統上乙個或幾個實際檔案的抽象,也就是說我們的資料說到底還是儲存在磁碟上的。但是各位也都知道,磁碟的速度慢的跟烏龜一樣,怎麼能配得上「快如風,疾如電"的cpu呢?這裡,緩衝池可以幫助我們消除cpu和磁碟之間的鴻溝。所以innodb儲存引擎在處理客戶端的請求時,當需要訪問某個頁的資料時,就會把完整的頁的資料全部載入到記憶體中,也就是說即使我們只需要訪問乙個頁的一條記錄,那也需要先把整個頁的資料載入到記憶體中。將整個頁載入到記憶體中後就可以進行讀寫訪問了,在進行完讀寫訪問之後並不著急把該頁對應的記憶體空間釋放掉,而是將其快取起來,這樣將來有請求再次訪問該頁面時,就可以省去磁碟io的開銷了。

快取原則

「位置*頻次」這個原則,可以幫我們對i/o 訪問效率進行優化。

首先,位置決定效率,提供緩衝池就是為了在記憶體中可以直接訪問資料。

其次,頻次決定優先順序順序。因為緩衝池的大小是有限的,比如磁碟有200g,但是記憶體只有16g,緩衝池大小只有1g,就無法將所有資料都載入到緩衝池裡,這時就涉及到優先順序順序,會優先對使用頻次高的熱資料進行載入

緩衝池的預讀特性

了解了緩衝池的作用之後,我們還需要了解緩衝池的另乙個特性:預讀

緩衝池的作用就是提公升i/o效率,而我們進行讀取資料的時候存在乙個「區域性性原理」,也就是說我們使用了一些資料,大概率還會使用它周圍的一些資料,因此採用「預讀"的機制提前載入,可以減少未來可能的磁碟ⅳ/o操作。

緩衝池管理器會盡量將經常使用的資料儲存起來,在資料庫進行頁面讀操作的時候,首先會判斷該頁面是否在緩衝池中,如果存在就直接讀取,如果不存在,就會通過記憶體或磁碟將頁面存放到緩衝池中再進行讀取。

如果我們執行sql語句的時候更新了快取池中的資料,那麼這些資料會馬上同步到磁碟上嗎?

實際上,當我們對資料庫中的記錄進行修改的時候,首先會修改緩衝池中頁裡面的記錄資訊,然後資料庫會以一定的頻率重新整理到磁碟上。注意並不是每次發生更新操作,都會立刻進行磁碟回寫。緩衝池會採用一種叫做checkpoint的機制將資料回寫到磁碟上,這樣做的好處就是提公升了資料庫的整體效能。

比如,當緩衝池不夠用時,需要釋放掉一些不常用的頁,此時就可以強行採用checkpoint的方式,將不常用的髒頁回寫到磁碟上,然後再從緩衝池中將這些頁釋放掉。這裡髒頁(dirty page)指的是緩衝池中被修改過的頁,與磁碟上的資料頁不一致。

buffer pool本質是innodb向作業系統申請的一塊連續的記憶體空間,在多執行緒環境下,訪問buffer pool中的資料都需要加鎖處理。在buffer pool特別大而且多執行緒併發訪問特別高的情況下,單一的buffer pool可能會影響請求的處理速度。所以在buffer pool特別大的時候,我們可以把它們拆分成若干個小的buffer pool,每個buffer pool都稱為乙個例項,它們都是獨立的,獨立的去申請記憶體空間,獨立的管理各種鍊錶。所以在多執行緒併發訪問時並不會相互影響,從而提高併發處理能力。

我們可以在伺服器啟動的時候通過設定innodb_buffer_pool_instances的值來修改buffer pool例項的個數比方說這樣:

[server]

innodb_buffer_pool_instances = 2

這樣就表面我們要建立2個buffer pool例項(緩衝池總量大小不變,即每個buffer pool的大小為原來的一半)

不過也不是說buffer pool例項建立的越多越好,分別管理各個buffer pool也是需要效能開銷的,innodb規定:當innodb_buffer_pool_sie的值小於1g的時候設定多個例項是無效的,innodb會預設把

innodb_buffer_pool_instances的值修改為1。而我們鼓勵在buffer pool大於或等於1g的時候設定多個buffer pool例項。

資料庫緩衝池

資料庫緩衝池如何讀取資料?緩衝池管理器會將經常使用的資料儲存起來,在資料庫頁面讀操作的時候,進行判斷。首先判斷頁面是否在緩衝池中,如果存在就直接讀取,如果不存在,就會通過記憶體或磁碟將頁面存放在緩衝池中再進行讀取。執行sql語句的時候更新了緩衝池中的資料,資料是否會馬上同步到磁碟上?對資料庫的記錄進...

Mysql資料庫緩衝池學習筆記

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

執行緒池 資料庫連線池

執行緒池的原理 來看一下執行緒池究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡 眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於...