MySQL InnoDB的記憶體管理
一、前言:資料庫的引擎是整個mysql資料庫的核心元件,mysql的儲存引擎眾多,MyISAM、InnoDB、Memory、Archive等,其中InnoDB是mysql裡面支援事務型別的一個儲存引擎最好的一個,雅虎、facebook、youtube、淘寶、谷歌用的mysql資料庫都有用到InnoDB的儲存引擎;
在此附上經典的mysql的架構圖:
二、透過了解mysql的系統架構之後,便可以初步的瞭解innodb儲存引擎的架構模型了,接下來又是一張經典的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緩衝池時,這個值也應該相應增加; 簡單理解為:額外緩衝池用於管理緩衝池的內容的,所以緩衝池越大額外換池也需要越大; |
總結:瞭解資料庫的記憶體結構,為深入學習innodb奠定一個良好的理論基礎;工作中很多人都不願意學習理論性的基礎,就像在學習資料庫的時候,大部分人更傾向於學習一些sql語句修改:比如擴大表空間、修改資料檔案。個人在學習的時候從來不記錄這些語句的,畢竟需要用的時候網上搜尋一籮筐,而是更喜歡記錄一些原理性的東西,做到每個操作都胸有成竹;
........................................................................................................................................................................
本文作者:JOHN,某上市公司DBA,業餘時間專注於資料庫的技術管理,從管理的角度去運用技術。
技術部落格:獵人筆記 資料庫技術群:367875324 (請備註ORACLE管理 )
........................................................................................................................................................................
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25723371/viewspace-1411409/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL InnoDB記憶體配置MySql記憶體
- 【Mysql】讀書筆記之--innodb_buffer_pool記憶體的管理MySql筆記記憶體
- MySQL 配置InnoDB的記憶體分配器MySql記憶體
- MySQL記憶體管理MySql記憶體
- Innodb記憶體管理解析[轉載]記憶體
- MYSQL的記憶體管理方法MySql記憶體
- MySQL探祕(三):InnoDB的記憶體結構和特性MySql記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- 記憶體管理 記憶體管理概述記憶體
- InnoDB儲存引擎——記憶體儲存引擎記憶體
- 【Mysql】Mysql額外記憶體池 innodb_additional_mem_pool_sizeMySql記憶體
- innodb的幾個記憶體引數記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- Aerospike的bin記憶體管理--即列記憶體管理ROS記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- MySQL記憶體管理,記憶體分配器和作業系統MySql記憶體作業系統
- 【記憶體管理】記憶體佈局記憶體
- 記憶體管理記憶體
- 記憶體管理兩部曲之實體記憶體管理記憶體
- CF的記憶體管理。記憶體
- JavaScript的記憶體管理JavaScript記憶體
- Go:記憶體管理與記憶體清理Go記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- 【記憶體管理】Oracle AMM自動記憶體管理詳解記憶體Oracle
- MySQL查詢select語句的執行流程以及InnoDB記憶體結構MySql記憶體
- Linux 記憶體管理:記憶體對映Linux記憶體
- MySQL記憶體使用MySql記憶體
- 記憶體管理-swMemoryGlobal記憶體
- OC記憶體管理記憶體
- iOS 記憶體管理iOS記憶體
- JavaScript 記憶體管理JavaScript記憶體
- Oracle 記憶體管理Oracle記憶體
- JavaScript記憶體管理JavaScript記憶體
- 2 Day DBA-管理Oracle例項-管理記憶體-修改記憶體設定-自動記憶體管理Oracle記憶體
- MRC 時代的記憶體管理記憶體
- javascript中的記憶體管理JavaScript記憶體
- SGI STL 的記憶體管理記憶體