天天看點

MySQL InnoDB的記憶體管理

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

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

MySQL InnoDB的記憶體管理
二、通過了解mysql的系統架構之後,便可以初步的了解innodb存儲引擎的架構模型了,接下來又是一張經典的innodb存儲引擎的系統架構圖
MySQL InnoDB的記憶體管理

從圖上看可以清晰的看到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緩沖池時,這個值也應該相應增加;

簡單了解為:額外緩沖池用于管理緩沖池的内容的,是以緩沖池越大額外換池也需要越大;

繼續閱讀