Mysql資料庫緩衝池學習筆記

2021-08-28 05:09:45 字數 2817 閱讀 1208

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

2、那麼如果sql語句修改了快取池的頁的資料,資料是怎麼同步到磁碟儲存的?

對於資料庫中頁的修改操作,則首先修改快取池中的頁,然後再以一定的頻率重新整理到磁碟上。注意:緩衝池重新整理回磁碟並不是每次頁發生更新時觸發,而是通過一種稱為checkpoint的機制重新整理回磁碟。這樣,是為了進一步提高資料庫整體效能。

3、作業系統對mysql資料庫緩衝池大小的影響。

32位作業系統下最大值為3g。(使用者可以開啟作業系統的pae選項來獲得32位作業系統下最大64gb記憶體的支援)

強烈建議資料庫伺服器採用64位作業系統

對於innodb儲存引擎而言,緩衝池配置通過 innodb_buffer_pool_size 來設定

show variables like 'innodb_buffer_pool_size'\g; 檢視innodb儲存引擎緩衝池大小

4、設定多個緩衝池。

從innodb 1.0.x版本開始,允許多個緩衝池例項。每個頁根據雜湊值平均分配到不同緩衝池例項中。這樣做是為了減少資料庫內部資源競爭,增加資料庫併發能力。可以通過innodb_buffer_poll_instances來進行配置,該值預設為1。

show variables like 'innodb_buffer_pool_instances'\g;  ------檢視innodb儲存引擎緩緩存池個數(值)

5、檢視每個緩衝池例項物件的執行狀態。

可以通過 show engine innodb status 觀察每個緩衝池例項物件執行的狀態

mysql5.6版本開始,可以通過information_schema架構下的表innodb_buffer_pool_stats來觀察緩衝的狀態。

sql語句:select pool_id,pool_size,free_buffers,database_pages from innodb_buffer_pool_stats\g;

6、看完上面所述自然就產生乙個問題,這麼大的緩衝池innodb儲存引擎是怎麼對它進行管理操作的呢?下面詳細講述 lru list 和 free list 和 flush list。

lru演算法概述:資料庫中的緩衝池是通過lru (latest recent used,最近最少使用)演算法來進行管理的。即 最多使用頁在lru列表前端,而最少使用頁在lru列表後端。當緩衝池不能存放新讀取到的頁時,將首先釋放lru列表中末端的頁。

innodb儲存引擎也是使用lru演算法,不同的是,它對傳統lru演算法做了一些優化。在innodb中lru列表還加入了midpoint位置。

midpoint位置就是讀取到新頁時,不是重新整理到lru的首頁,而是lru列表的midpoint位置。這個演算法在innodb儲存引擎下稱為midpoint insertion strategy。在預設值下,該位置在lru列表長度的5/8處。midpoint位置可有引數 innodb_old_blocks_pct 控制。

show variables like 'innodb_old_blocks_pct'\g;---------檢視midpoint位置  單位 %;  value:37,就是 37%。

midpoint之後的頁稱為oid列表,之前的稱為new列表。new列表中的頁時最為活躍的資料。

常見的索引或資料掃瞄sql操作,這類操作需要需要訪問表中的許多頁,甚至全部頁。而這些頁通常來說僅僅在這次查詢中需要,並不是活躍的熱點資料。如果頁被放入lru列表首部,那麼可能將所需要的熱點資料頁從lur中移除,下次需要讀取頁時,innodb儲存引擎需要再次訪問磁碟。為了解決這個問題,innodb儲存引擎引入另乙個引數,innodb_old_blocks_time,用於表示頁讀取到mid位置後等待多久才會被加入到lru列表的熱端。

可以通過下面方法使lru列表的熱點盡量不被輸出

set global innodb_old_blocks_time=1000;

資料或索引掃瞄操作

set global innodb_old_blocks_time=0;

如果使用者預估自己活躍的熱點資料不止63%,那麼在執行sql語句前,可以通過下面語句減少熱點頁可能被刷出的概率。

set global innodb_old_blocks_pct=20;

free頁:當lru頁為空時,首先檢視free列表是否有此空閒頁,若有則刪除同時新增到lru列表。如果沒有該頁,則根據lru演算法,淘汰lru列表末尾的頁,將該記憶體空間分配給新的頁。

當頁從lru列表的old部分加入到new部分時,稱此發生操作為page made young,而因為innodb_old_blocks_time 的設定導致頁沒有從old部分移動到new部分的操作稱為page not made young 。可以通過命令 show engine innodb status 來觀察lru列表及free列表的使用情況和執行狀態。

注意:show engine innodb status 顯示的不是當前的狀態,而是過去某個時間的值。

如果buffer pool hit rate 的值小於95%,使用者需要觀察是否由於全表掃瞄引起的lru列表汙染問題。

flush頁:在lru列表中被修改過的頁稱為髒頁,即緩衝池找中的頁和磁碟上的頁的資料產生了不一致。這時資料庫會通過checkpoint機制將髒頁重新整理回磁碟而flush列表中的頁即為髒頁列表。

注意:髒頁即存在lru列表中,頁存在flush列表中。lru列表用來管理緩衝池中的頁的可用性,flush 列表用來管理將頁重新整理回磁碟,二者互不影響。

資料庫緩衝池

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

資料庫緩衝池(Buffer Pool)

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

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

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