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