MySQL InnoDB體系架構之記憶體

2021-07-24 08:05:11 字數 2606 閱讀 8113

先上圖

1.緩衝池

innodb儲存引擎是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。通常使用緩衝池來提高資料庫的整體效能。緩衝池簡單說就是一塊記憶體,通過記憶體的速度彌補磁碟速度較慢對資料庫效能的影響。在資料庫中進行讀操作時,首先將從磁碟讀到的頁存放在緩衝池中,下一次讀取相同的頁時,首先判定是否存在緩衝池中,如果有就是被命中直接讀取,沒有的話就從磁碟中讀取。在資料庫進行改操作時,首先修改緩衝池中的頁,然後在以一定的頻率重新整理到磁碟上。這裡的重新整理機制不是每頁在發生變更時觸發。而是通過一種checkpoint機制重新整理到磁碟的。可以通過innodb_buffer_pool_size(單位塊)引數來設定緩衝池的大小。緩衝池中的資料庫型別有:索引頁、資料頁、undo頁、插入快取頁(insert buffer)、自適應hash(adaptive hash index)、innodb儲存的鎖資訊(lock info)、資料字典資訊(data dictionary)。通過引數innodb_buffer_pool_instances設定允許有多個緩衝池例項,每個頁根據雜湊值平均分配到不同的例項中,以減少資料庫內部資源的競爭,增加資料庫的併發處理能力。

2.lru list、free list和flush list

innodb儲存引擎的緩衝池是通過lru演算法來進行管理的,即最頻繁使用的頁在lru列表(管理已經讀取到的頁)的前段,最少使用的頁在lru列表的尾端。緩衝池中每頁大小16k。但是它對lru演算法做了一些優化,加入了midpoint位置。新獲取的資料放入midpoint,而不是放入列表頭部。通常midpoint在lru列表的5/8處。可以通過innodb_old_blocks_pct引數來設定。把midpoint之後的列表稱為old列表,之前的稱為new列表。為什麼在innodb儲存引擎採用midpoint呢?這是因為如直接將讀取到的也放入lru的首端,某些sql操作導致緩衝池中的頁被刷出,從而影響緩衝池的效率。可以通過引數innodb_old_blocks_time設定頁讀取到midpoint位置後需要等待多久才會加入lru的new列表。

當資料庫剛啟動時,lru列表是空的,這時所有的頁都放在free列表中的。當需要從緩衝池中分配頁時,首先從free列表中檢視是否有空閒的空閒頁,若有則從free列表中刪除然後加入到lru列表中。否則根據lru演算法,淘汰lru列表末尾的頁,將該記憶體空間分配給新的頁。當頁從lru的old部分加入到new部分,此時發生的操作是page made young,而因為innodb_old_blocks_time引數的設定導致頁沒有從old加入到new的操作稱為page not made young。從innodb儲存引擎1.0.x版本開始支援壓縮頁的功能。即將原來16k的頁壓縮為1k、2k、4k和8k,由於頁的大小發生變化,lru列表頁有相應的變化,對於非16k的頁時通過unzip_lru列表進行維護。在lru列表中的頁被修改後,該頁稱為髒頁(dirry page),這時資料庫通過checkpoint機制將髒頁刷回磁碟。而flush列表中的頁就是髒頁列表。髒頁即存在於lru列表頁存在於flush列表。lur列表用來管理緩衝池中頁的可用性,flush列表用來管理將也刷回磁碟。可以通過show engine innodb status命令來檢視lru列表和free列表的使用情況和執行狀態。

由圖可以看出:

buffer pool size總共有8191個頁(8191*16k);

free buffers表示當前free列表中的頁的數量;

datebase pages表示lru列表中頁的數量。可能free buffers和database pages之和不等於buffer pool size。這是因為緩衝池中的也還可能會被分配給自適應雜湊索引、lock資訊、insert buffer等頁。而這部分是不需要lru演算法維護的,因此不在lru列表中。

page made young表示lru列表中頁移動到前段的次數。

buffer pool hit rate表示緩衝池的命中率,該值不能小於95%。

lru len表示lru列表中有多少頁。

unzip_lru len表示壓縮的頁數;其中lru len包含unzip_lru len。modified db pages表示當前髒頁的數量。

還可以通過  information_schema.innodb_buffer_page_lru表來觀察lru列表中每個頁的具體資訊。

3.重做日誌緩衝(redo log buffer)

innodb儲存引擎首先將重做日誌資訊放入這個緩衝區,然後按照一定的頻率將其刷入重做日誌檔案中。重做日誌緩衝區一般不需要很多,只要保證每秒產生的事務量在這個緩衝大小之內即可。可以通過innodb_log_buffer_size引數設定大小。

4.額外的記憶體池

在innodb儲存引擎中,對記憶體的管理是通過一種稱為記憶體堆(heap)的方式進行。在對一些資料結構本身的記憶體進行分配時,需要從額外的記憶體池中進行申請,當該區域的記憶體不夠時,需要從緩衝池中申請。例如l:分配了緩衝池,但是每個緩衝池中的幀緩衝(frame buffer)還有對應的緩衝控制物件(buffer control block),這些記錄了一些諸如lru、鎖、等待等資訊,而這個物件的記憶體就需要從額外記憶體池中申請。因此在申請了很大的緩衝池是也要考慮相應增加這個值。

MySQL InnoDB的體系架構

innodb儲存引擎是乙個完整支援acid事務的mysql儲存引擎,其特點是 行鎖設計,支援mvcc,支援外來鍵,提供一致性非鎖定讀,同時被設計用來最有效的利用以及使用記憶體和cpu 1.innodb體系架構 圖中簡單顯示了innodb的儲存引擎的體系架構,從圖中可見,innodb有多個記憶體塊,可...

(三)Mysql InnoDB 架構全解

我們先看一下記憶體結構。buffer pool主要分為3個部分 buffer pool.change buffer adaptive hash index,另外還有乙個 redo log buffer buffer pool快取的是頁面資訊,包括資料頁 索引頁。buffer pool預設大小是128...

Oracle體系架構

oracle資料庫由兩個實體組成 1 例項 2 資料庫 例項 例項由儲存結構和程序組成,短暫存在於ram和cpu 因此例項的生存時間其在記憶體的時間,我們可以啟動和停止例項。資料庫 資料庫分為物理結構和邏輯結構。物理結構 物理結構就是磁碟上的物理檔案 包括三類檔案 控制檔案 control file...