innodb引擎是mysql外掛程式引擎的其中乙個,由許多記憶體塊組成乙個記憶體池,主要負責:
innodb引擎是基於磁碟儲存的,儲存的基本單位是頁(16kb),由於cpu和io速度差異的問題,需要使用快取記憶體來提高效能。
緩衝池的大小可以通過引數innodb_buffer_pool_size來設定,緩衝池涉及到的頁種類有:
innodb通過這幾個list來對緩衝池中這麼多的頁進行管理。
一般緩衝池通過lru(latest recent used)演算法來進行管理(和計算機cache的管理演算法類似),最頻繁使用的頁在lru列表的最前端,最少使用的頁在最後端。自適應雜湊索引,lock資訊,insert buffer等頁不用lru演算法來維護。
innodb在lru list中插入新頁不是插入到最前端,而是插入到midpoint位置,midpoint位置預設為列表長度的5/8處,可以通過引數innodb_old_blocks_pct來控制,把midpoint之前的表稱為new list,之後的old list。這樣做的原因是放到隊首的話某些sql操作會讓緩衝池中的髒頁被重新整理出,並將熱點資料頁從lru list中移除,而下次讀取該頁時需要再次訪問磁碟,影響引擎效率。
為了讓新加頁延遲進入熱點資料頁,可以通過引數innodb_old_blocks_time來設定延遲進入時間。
lru list管理的是快取中已經讀取的頁,資料庫剛啟動時緩衝池中的頁都放在free list,當需要某個頁時如果free list有空閒頁,就從free list中刪除這段記憶體資訊並新增到lru list中,否則淘汰lru list末端的頁,並將該頁的記憶體給新頁來用。
1.0.x版本後支援壓縮頁功能,將頁壓縮為1,2,4或者8kb,非16kb的頁不由lru list來管理,而是通過unzip_lru list來管理。
unzip_lru建立4個不同的鍊錶來分別管理1,2,4,8kb的壓縮頁,記憶體分配通過夥伴演算法來管理:
//夥伴演算法
//要申請4kb的記憶體來存頁
if 4kb unzip_lru list有空閒頁記憶體:
直接用else:
if 8kb unzip_lru list有空閒記憶體頁:
分成2個4kb頁放入到4kb的list中,再用
else:
從lru列表中申請16kb頁,分成1個8kb,2個4kb的頁,放入對應的list
在lru list中頁被修改後,被稱為髒頁,這時緩衝池中的頁資料和磁碟的頁資料不一致了,髒頁資料會統一被flush list管理,通過checkpoint機制來把髒頁資料重新整理到磁碟中。注意lru和flush list都會儲存髒頁資訊。
innodb引擎的記憶體區除了緩衝池還有redo log快取,innodb會將redo日誌資訊放入到這個緩衝區,再按一定平律將其重新整理到磁碟redo log檔案,該快取的大小由引數innodb_log_buffer_size控制,預設8mb。redo log快取會在一下情況把快取中的內容重新整理到外部磁碟的redo log檔案中:
在對一些資料結構本身的記憶體分配時,會從額外的記憶體池進行申請,不夠時則從快取池進行申請
如果緩衝池中沒有乙個頁變化,就重新整理到磁碟,這樣花銷太大,而且在從緩衝池更新到磁碟時發生宕機的話,存在資料丟失的問題,所以一般採取write ahead log策略,當事務提交時,先寫redo log,再修改磁碟的相關頁,這樣就用redo log作為備份。
checkpoint技術就是將緩衝池中的髒頁重新整理到磁碟上,主要解決:
innodb有兩種checkpoint:
InnoDB儲存引擎 記憶體 緩衝池
innodb儲存引擎是基於磁碟儲存的,並將其記錄按照頁的方式進行管理.而磁碟io與記憶體io的速度相差可能接近1000倍,所以使用緩衝池 buffer pool 可以有效提高響應能力.當資料庫需要進行資料頁讀取的時候,先將頁資料儲存在緩衝池中,下一次再讀取的時候,先檢查緩衝池中是否存在資料,如果存在...
InnoDB 儲存引擎
innodb是事務型資料庫的首選引擎,支援事務安全表 acid 支援行鎖定和外來鍵。mysql 5.5.5 之後,innodb作為預設儲存引擎。innodb的主要特性有一下幾項。a.innodb給mysql提供了具有提交 回滾和崩潰恢復能力的事務安全 acid相容 儲存引擎。innodb鎖定在行級並...
InnoDB 儲存引擎
設計上採用了類似於oracle資料庫的架構 接下來 詳細介紹 innodb 儲存引擎的 體系架構 及其不同於其他儲存引擎的特性 一 概述 innodb 儲存引擎 是第乙個完整支援acid事物的 mysql 儲存引擎 特點 1 行鎖設計 2 支援mvcc 3 提供一致性非鎖定讀 4 最有效地利用 以及...