MySQL InnoDB的內存管理

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

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

p_w_picpath

 

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

p_w_picpath  

從圖上看可以清晰的看到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語句修改:比如擴大表空間、修改數據文件。個人在學習的時候從來不記錄這些語句的,畢竟需要用的時候網上搜索一籮筐,而是更喜歡記錄一些原理性的東西,做到每個操作都胸有成竹; 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章