1. 程式人生 > >InnoDB體系架構(二)內存

InnoDB體系架構(二)內存

heap 數量 logs 架構 競爭 targe 應用 pct 默認

InnoDB體系架構(二)內存

  上篇文章 InnoDB體系架構(一)後臺線程 介紹了MySQL InnoDB存儲引擎後臺線程:Master Thread、IO Thread、Purge Thread、Page Cleaner Thread 四種

  這篇文章將介紹 InnoDB體系架構中的內存,主要有四小結分別為:緩沖池、緩沖池的管理、重做日誌緩沖、額外內存緩沖

  以下圖為InnoDB存儲引擎的內存結構。

     技術分享圖片

一、緩沖池

  InnoDB存儲引擎是基於磁盤存儲的,按照頁的方式進行管理的,理解為基於磁盤的數據庫系統。在數據庫系統中,由於CPU(快)與磁盤(慢)數據之間的差異,通常使用緩沖池技術來提高數據庫的整體性能。

  在數據庫進行讀取時首先將磁盤讀到的頁放入緩沖池中,在下次讀取相同頁時候,如果該頁存在於緩沖池,則優先讀取。

  對於數據庫中頁的修改操作,首先先操作緩沖池中的頁,然後再通過一種名為Checkpoint的機制 按照一定的頻率刷新到磁盤中。

查看InnoDB存儲引擎緩沖池可以通過:
show variables like innodb_buffer_pool_size\G

  自InnoDB1.0+開始,緩沖池有多個,為了減少數據庫內部的資源競爭,通過設置 innodb_buffer_pool_instance 來設置緩沖池數量。

二、緩沖池管理(LRU List、Free List 和 Flush List)

  1. LRU List

  上面說到緩沖池是一個內存區域,裏面存放了各種類型的頁,那麽是如何管理的呢?

  InnoDB存儲引擎的緩沖池是通過LRU算法來進行管理的,即最頻繁使用的頁在LRU列表的前端,最少使用的頁在LRU列表的尾端

  緩沖池中頁的大小默認為16KB,與普通的LRU算法稍有不同的是,InnoDB使用LRU算法進行管理時加入了 midpoint(默認將新讀取到的頁存放到列表長度為5/8出)可以通過innodb_old_blocks_pct控制。為什麽這麽做呢? 主要是為了防止某些SQL操作,可能會訪問大量的頁(超過了原本LRU列表的數量)從而原本熱點數據被移除,引起性能問題。

  至於mid中的數據多久會加入到LRU的熱端呢? 可以通過 set global innodb_old_blocks_time=1000 進行設置。

  2. Free List

  在數據庫剛啟動的時候,LRU是空的(沒有頁),這時候頁都存放在一個叫Free List中,當需要從緩沖池中分頁時,會從Free列表中查找可用的空閑頁,若有,將頁從Free List中刪除,放入LRU List中,否則根據LRU List 淘汰算法,淘汰LRU List的末尾頁。

  InnoDB1.0+開始支持壓縮頁功能,將原本16KB的頁壓縮為1KB、2KB、4KB、8KB。對於非16KB的頁,通過unzip_LRU列表進行管理。 其中LRU列表包含了uzip_LRU列表。

  如果需要從緩沖池中申請頁大小為4KB的頁時,有以下步驟:

  1) 檢查4KB的unzip_LRU 列表是否有空閑頁

  2) 有,則使用。

  3) 否則,檢查8KB的unzip_LRU 列表

  4) 有則將頁分為 2個 4KB的頁,存放到4KB的unzip_LRU列表中。

  5) 若不能是,則拆16KB的。

  3. Flush List

  在LRU列表中頁被修改後,該頁被稱為了臟頁,因為緩沖池中的頁和磁盤頁數據不一致,這時候數據庫會通過Checkpoint機制將臟頁刷新到磁盤。臟頁存在於LRU和Flush列表中,LRU列表用來管理緩沖池中頁到可用性,FLush列表用來管理將頁刷新回磁盤,兩者互不影響。

三、重做日誌緩沖

  InnoDB存儲引擎會首先將重做日誌緩沖放到重做日誌緩沖區,然後按照一定頻率刷新到重做日誌文件。一般默認8M(滿足絕大部分應用)

  以下三種情況都會將重做日誌緩沖刷新到日誌文件中:

  1)Master Thread 每秒刷新一次至日誌文件中;

  2)每個事務提交會將重做日誌緩沖刷新到重做日誌日誌中。

  3)當重做日誌緩沖剩余空間小於1/2時

四、額外的內存池

   在innoDB存儲引擎中,對內存的管理是通過一種稱為內存堆(heap)的方式進行。在對一些數據結構本身的內存進行分配時,需要從額外的內存池中進行申請,當該區域的內存不夠時,需要從緩沖池中申請。

  例如L:分配了緩沖池,但是每個緩沖池中的幀緩沖(frame buffer)還有對應的緩沖控制對象(buffer control block),這些記錄了一些諸如LRU、鎖、等待等信息,而這個對象的內存就需要從額外內存池中申請。因此在申請了很大的緩沖池是也要考慮相應增加這個值。

    

InnoDB體系架構(二)內存