innodb的組成部分:
1.後台執行緒
2.儲存引擎記憶體池
innodb儲存引擎記憶體緩衝池
1.記憶體緩衝池
innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩衝池技術來提高資料庫的整體效能。
緩衝池簡單來說就是一塊記憶體區域,通過記憶體的速度來彌補磁碟速度較慢對資料庫效能的影響。在資料庫進行讀取頁的操作,首先將從磁碟讀到的頁存放到緩衝池中,這個過程稱為將頁「」fix「」在緩衝池中。下一次再讀取相同的頁時,首先判斷該頁是否存在緩衝池中。若在緩衝池中,稱該頁在緩衝池中被命中,直接讀取該頁。否則讀取磁碟上的頁。
對於資料庫中頁的修改操作,首先修改在緩衝池中的頁,然後再以一定的速率重新整理到磁碟上。這裡需要注意的是,頁從緩衝池重新整理回磁碟的操作並不是在每次頁發生更新時觸發,而是通過一種checkpoint的機制重新整理回磁碟。同樣,這要是為了提高資料庫的整體效能。
具體來看,緩衝池中快取的資料有:資料頁,索引頁,自適應雜湊所有,插入緩衝,undo頁,innodb儲存的鎖資訊,資料字典資訊等。不能簡單地認為,緩衝池只是快取索引頁和資料頁,他們只是佔了緩衝池的一大部分而已。
從innodb1.x開始,允許有多個緩衝池例項。每個頁根據雜湊值平均分配到不同緩衝池例項中。這樣做的好處是,減少資料庫內部的資源競爭,增加資料庫的併發處理能力。可以通過引數innodb_buffer_pool_instances來進行配置,預設是1.
2.lru list,free list和 flush list
緩衝池是乙個很大的記憶體區域,其中存放各種型別的頁。那麼innodb是如何對這麼大的記憶體區域進行管理呢?
通常來說,資料庫的緩衝池是通過lru(latest recent used,最近最少用)演算法來進行管理的。即最頻繁使用的頁在lru列表的前端,而最少使用的頁在lru列表的末端。當緩衝池不能存放新讀取的頁時,將首先釋放lru列表中尾端的頁。
在innodb儲存引擎中,儲存引擎的頁預設大小是16kb,同樣使用lru演算法對緩衝池進行管理。稍有不同的是innodb儲存引擎對傳統的lru演算法做了一些優化。在innodb的儲存引擎中,lru還加入額midpoint的位置。新讀取到的頁,雖然是最新訪問的頁,但並不是直接放入到lru列表的首部,而是放入到lru列表的midpoint位置。這個演算法在innodb儲存引擎下稱為midpoint insertion strategy。在預設配置下,該位置在lru列表長度的5/8處。midpoint位置可由引數innodb_old_blocks_pct控制,如:
mysql> show variables like 'innodb_old_blocks_pct'\g;
*************************** 1. row ***************************
variable_name: innodb_old_blocks_pct
value: 37
1 row in set (0.00 sec)
從上面的例子可以看到,引數innodb_old_blocks_pct預設值為37,表示新讀取的頁插入到lru列表尾端的37%位置(差不多3/8的位置)。在innodb儲存引擎中,把midpoint之後的列表稱為old列表,把midpoint之前的列表稱為new列表。可以簡單地理解為new 列表中的頁都是最活躍的熱點資料。
那為什麼不採用樸素的lru演算法,直接將讀取的頁放入到lru列表的首部呢?這是因為若將直接讀取的頁放入到lru的首部,那麼某些sql操作可能會使緩衝池中的頁被重新整理出,從而影響緩衝池中的效率。常見的這類操作為索引或資料的掃瞄操作。這些操作需要訪問表中的許多頁,甚至是全部的頁,而這些頁並非熱點資料,僅僅是這次查詢需要,如果頁被放到了lru的首部,那麼非常可能將所需要的熱點資料頁從lru列表中移除,而在下一次需要讀取該頁時,innodb儲存引擎需要再次訪問磁碟。
lru列表用來管理已經讀取的頁,但當資料庫剛啟動時,lru列表是空的,即沒有任何的頁。這時頁都存放在free列表中。當需要從緩衝池中分頁時,首先從free列表中檢視是否有可用的空閒頁,若有則將該頁從free列表刪除,放入到lru列表中。否則,根據lru演算法,淘汰lru列表末尾的頁,將該記憶體空間分配給新的頁。
在lru列表中的頁被修改後,稱該頁為臟頁,即緩衝池中的頁和磁碟上的頁的資料產生了不一致。這是資料庫會通過checkpoint機制將髒頁重新整理回磁碟,而flush列表中的頁即為髒頁列表。需要注意的是,髒頁既存在於lru列表中,也存在於flush列表中。lru列表用來管理緩衝池中頁的可用性,flush獵豹用來管理將頁重新整理會磁碟,二者互不影響。
3.重做日誌緩衝
innodb儲存引擎首先將重做日誌資訊先放入到這個緩衝區,然後按一定頻率將其重新整理到重做日誌檔案。重做日誌緩衝一般不需要設定為很大,因為一般情況下每一秒鐘會將重做日誌緩衝重新整理到日誌檔案,因此使用者只需要保證每秒產生的事務量在這個緩衝大小之內即可。
4.額外的記憶體池
在innodb儲存引擎中,對記憶體的灌流是通過一種成為記憶體堆的方式進行的。對一些資料結構本身的記憶體進行分配時,需要從額外的記憶體池中進行申請,當該區域的記憶體不夠時,會從緩衝池中進行申請。例如,分配了緩衝池,但是每個緩衝池中的幀緩衝還有對應的緩衝控制物件,這些物件記錄了一些諸如lru,鎖,等待等資訊,而這個物件的記憶體需要從額外記憶體池中申請。因此在設定了很大的緩衝池時,也應考慮相應地增加這個值
Mysql Innodb儲存引擎
鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...
MYSQL INNODB 儲存引擎
innodb 是事務安全的mysql儲存引擎,設計上採用了類似於oracle的架構。一般而言,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。同時,也是因為innodb的存在,才使得mysql變得更有魅力。第一 innodb儲存引擎概述 innodb由innobase oy 公司開...
MYSQL InnoDB儲存引擎 鎖
目錄 鎖的型別 行級鎖 意向鎖 一種表級鎖 一致性非鎖定讀 innodb儲存引擎的預設設定 行鎖的3種演算法 死鎖 innodb儲存引擎實現了如下兩種標準的行級鎖 1 共享鎖 s lock 允許事務讀一行資料。select column from table lock in share mode 2...