一、前言:資料庫的引擎是整個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緩沖池時,這個值也應該相應增加; 簡單了解為:額外緩沖池用于管理緩沖池的内容的,是以緩沖池越大額外換池也需要越大; |