MySQL InnoDB的記憶體管理

fengzhanhai發表於2015-01-22

一、前言:資料庫的引擎是整個mysql資料庫的核心元件,mysql的儲存引擎眾多,MyISAM、InnoDB、Memory、Archive等,其中InnoDB是mysql裡面支援事務型別的一個儲存引擎最好的一個,雅虎、facebook、youtube、淘寶、谷歌用的mysql資料庫都有用到InnoDB的儲存引擎;

在此附上經典的mysql的架構圖:

image

 

二、透過了解mysql的系統架構之後,便可以初步的瞭解innodb儲存引擎的架構模型了,接下來又是一張經典的innodb儲存引擎的系統架構圖

image

從圖上看可以清晰的看到innodb儲存引擎可以分為三部分:記憶體、程式、資料檔案(如果瞭解ORACLE的話,ORACLE的架構體系跟這個是很像的,在比較中學習總是很有一番趣味

 

2.1 innodb的記憶體的作用大致如下:

  • 快取磁碟上的資料,方便快速的讀取;
  • 對磁碟檔案的資料進行修改之前在這裡快取;
  • 應用所作的日誌的快取;
  • 記憶體結構自身的管理結構;

記憶體結構根據功能可以分成三部分:Innodb buffer pool、additional buffer pool、log buffer;

 

2.1.1 Innodb buffer pool:緩衝池,從圖上可以看到buffer pool佔用最大塊的記憶體部分,主要用來各種資料的緩衝。innodb將資料檔案按頁(16K)讀取到緩衝池,然後按最少使用(LRU)演算法來保留快取資料;資料檔案修改時,先修改快取池中的頁(即髒頁),然後按一定平率將髒頁重新整理到檔案;

 

透過語句可以檢視mysql各記憶體的分配情況:

mysql> show variables like 'innodb_%_size';

+---------------------------------------------------+------------------+

| Variable_name | Value |

+----------------------------------------------------+------------------+

| innodb_additional_mem_pool_size | 8388608    |

| innodb_buffer_pool_size                | 134217728 |

| innodb_log_buffer_size                  |     8388608 |

| innodb_log_file_size                       |     5242880 |

| innodb_purge_batch_size               |             20 |

+-------------------------------------------+-----------------+

5 rows in set (0.00 sec)

innodb_additional_mem_pool_size 的大小為8388608/1024/1024=8M

innodb_buffer_pool_size 的大小134217728/1024/1024=128M

innodb_log_buffer_size 的大小8388608/1024/1024=8M

 

執行指令碼:show engine innodb status可以檢視innodb_buffer_pool的執行情況;

mysql> show engine innodb status\G;

***********************************************************

Type: InnoDB

Name:

Status:

Total memory allocated 137363456; in additional pool allocated 0

Dictionary memory allocated 53307

Buffer pool size 8192

Free buffers 7784

Database pages 406

Old database pages 0

Modified db pages 0

*********************************************************************************************

紅色的文字顯示InnoDB儲存引擎緩衝池的使用情況,這邊的單位是buffer frame,每個buffer frame為16K,透過計算可以檢視buffer pool的使用情況

  • Buffer pool size 8192×16k/1024=128M (跟上面的引數值是一致的)
  • Free buffers表示當前空閒的緩衝幀7784×16k/1024=121MB
  • Database pages表示已經使用的緩衝幀 406×16k/1024=6.34MB
  • Modified db pages 表示髒頁的數量,當前顯示為0;
  • Old database pages表示LRU列表中old sublist中的資料塊數量

對上面的innodb buffer pool細看會發現,buffer pool的資料型別又可以分為:page cache、hash index、undo、insert buffer、explicit locks;

 

2.1.2 Log Buffer:日誌緩衝池(功能跟oracle redo log buffer基本相似),將重做日誌資訊放入這個緩衝區,然後按一定頻率將其重新整理到重做日誌檔案。該值一般不需要設定很大,因為一般情況下每一秒鐘就會將重做日誌緩衝重新整理到日誌檔案,因此我們只需要保證每秒產生的食物量在這個緩衝大小之內即可;

指令碼: show variables like ' innodb_log_buffer_size ';   可以顯示log buffer的大小;

 

2.1.3 additional buffer pool:額外緩衝池,mysql技術內部Innodb儲存引擎上面是這樣介紹的:

在innodb儲存引擎中,對記憶體的管理是透過一種稱為記憶體堆的方式進行的。在對一些資料結構本身分配記憶體時,需要從額外獲得記憶體池中申請,當該區域的記憶體不夠時,Innodb會從緩衝池中申請。但是每個緩衝池中的frame buffer還有對應的緩衝控制物件,這些物件記錄了諸如LRU、鎖、等待等方面的資訊,而這個物件的記憶體需要從額外記憶體中申請。因此,當你申請了很大的Innodb緩衝池時,這個值也應該相應增加;

簡單理解為:額外緩衝池用於管理緩衝池的內容的,所以緩衝池越大額外換池也需要越大;

 

總結:瞭解資料庫的記憶體結構,為深入學習innodb奠定一個良好的理論基礎;工作中很多人都不願意學習理論性的基礎,就像在學習資料庫的時候,大部分人更傾向於學習一些sql語句修改:比如擴大表空間、修改資料檔案。個人在學習的時候從來不記錄這些語句的,畢竟需要用的時候網上搜尋一籮筐,而是更喜歡記錄一些原理性的東西,做到每個操作都胸有成竹;

........................................................................................................................................................................

本文作者:JOHN,某上市公司DBA,業餘時間專注於資料庫的技術管理,從管理的角度去運用技術。

技術部落格:獵人筆記               資料庫技術群:367875324 (請備註ORACLE管理 ) 

........................................................................................................................................................................

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25723371/viewspace-1411409/,如需轉載,請註明出處,否則將追究法律責任。

相關文章