MySQL InnoDB的體系架構

2021-09-19 09:56:21 字數 2367 閱讀 4147

innodb儲存引擎是乙個完整支援acid事務的mysql儲存引擎, 其特點是 行鎖設計, 支援mvcc, 支援外來鍵, 提供一致性非鎖定讀, 同時被設計用來最有效的利用以及使用記憶體和cpu

1.innodb體系架構

圖中簡單顯示了innodb的儲存引擎的體系架構, 從圖中可見,innodb有多個記憶體塊, 可以認為這些記憶體塊組成了乙個大的記憶體池, 負責如下工作 :

後台執行緒的主要作用是負責重新整理記憶體池中的資料, 保證緩衝池中的記憶體快取是最新的資料.此外將已修改的資料檔案重新整理到磁碟檔案, 同時保證資料庫發生異常的情況下innodb能恢復到正常執行狀態

1>後台執行緒

innodb儲存引擎是多執行緒的模型, 因此後台有多個不同的後台執行緒, 負責處理不同的任務

2>記憶體

innodb儲存引擎是基於磁碟儲存的, 並將其中的記錄按照頁的方式進行管理. 因此可以將其視為基於磁碟的資料庫系統(disk-base database). 在資料庫系統中, 由於cpu速度與磁碟速度之間的鴻溝, 基於磁碟的資料庫系統通常使用緩衝池技術來提高資料庫的整體效能.

緩衝池簡單來說就是一塊記憶體區域, 通過記憶體的速度來彌補磁碟速度較慢對資料庫效能的影響, 在資料庫中進行讀取頁的操作, 首先將從磁碟讀到 的頁存放在緩衝池中, 這個過程稱為將頁"fix"在緩衝池中, 下一次再讀相同的頁時,首先判斷該頁是否在緩衝池中, 如果在,責成該頁在緩衝池中被命中, 直接讀取該頁. 否則讀取磁碟上的頁

對於資料庫中頁的修改操作, 首先修改在緩衝池中的頁, 然後再以一定的頻率重新整理到磁碟上.是通過一種叫做checkpoint的機制重新整理回磁碟,提高資料庫的整體效能.

具體來看, 緩衝池中快取的資料頁型別有:索引頁,資料頁,undo頁,插入緩衝(insert buffer),自適應雜湊索引(adaptive hash inddex),innodb儲存的鎖資訊(lock info),資料字典資訊(data dictionary)等,在innodb 1.0.x開始, 允許有多個緩衝池例項,每個頁根據雜湊值平均分配到不同的緩衝池例項中,這樣做的好處是減少資料庫內部的資源競爭,增加資料庫的併發處理能力

資料庫的緩衝池是通過lru(latest recent used, 最近最少使用)演算法來進行管理的. 即最頻繁使用的頁在lru列表的前端,而最少使用的頁在lru列表的尾端. 當緩衝池不能存放新讀取到的頁時, 將首先釋放lru列表中尾端的頁

在innodb儲存引擎中, 緩衝池中頁的大小預設為 16kb, 同樣使用lru演算法對緩衝池進行管理,不同的是, 在innodb中,加入了midpoint位置. 新讀取的頁不直接放到lru列表的首部, 而是放到midpoint位置,預設實在lru列表的5/8處. midpoint之後的列表稱為old列表, 之前的列表稱為new列表,可以簡單的理解new列表中的頁都是最為活躍的熱點資料

lru用來管理已經讀取的頁, 但當資料庫剛啟動時, lru列表是空的, 即沒有任何的頁, 這時頁都放在free列表中.當需要從緩衝池中分頁時,首先從free列表中查詢是否有可用的空閒頁, 若有則將該頁從free列表中刪除,放入到lru列表中;否則,根據lru演算法,淘汰lru列表末尾的頁,將該記憶體空間分配給新的頁

當頁從lru列表的old部分加入到new部分時, 稱此時發生的操作為page made young

緩衝池中的頁還可能被分配給自適應雜湊索引, lock資訊, insert buffer等頁,而這部分不需要lru演算法維護

innodb從1.0.x版本開始支援壓縮頁的功能, 16kb的頁可被壓縮為1kb, 2kb, 4kb, 8kb

在lru中的頁被修改後, 稱該頁為臟頁(dirty page), 即緩衝池中的頁和磁碟上的頁資料產生了不一致. 這時資料庫會通過checkpoint機制將髒頁重新整理回磁碟, 而flush列表中的頁即為髒頁列表, 髒頁既存在於lru列表中, 也存在與flush列表中. lru列表用於管理緩衝池中頁的可用性, flush列表用來管理將頁重新整理回磁碟,二者互不影響

3>重做日誌緩衝

redo log buffer, innodb首先將重做日誌資訊先放入這個緩衝區, 然後按一定的頻率將其重新整理到重做日誌檔案. 一般情況下每一秒鐘會將重做日誌緩衝重新整理到日誌檔案, 重做日誌緩衝的預設大小為8mb

重做日誌緩衝會在以下三種情況下被重新整理到日誌檔案中:

4>額外的記憶體池

innodb對記憶體的管理 是通過一種稱為記憶體堆(heap)的方式進行的, 在對一些資料結構本身的記憶體進行分配時, 需要從額外的記憶體池中進行申請, 當該區域的記憶體不夠時,會從緩衝池中申請. 例如 : 分配了緩衝池, 但是每個緩衝池中的幀緩衝還有對應的緩衝控制物件(記錄了一些注入lru,鎖,等待等資訊),這些記憶體需要從額外記憶體池中申請

MySQL InnoDB體系架構之記憶體

先上圖 1.緩衝池 innodb儲存引擎是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。通常使用緩衝池來提高資料庫的整體效能。緩衝池簡單說就是一塊記憶體,通過記憶體的速度彌補磁碟速度較慢對資料庫效能的影響。在資料庫中進行讀操作時,首先將從磁碟讀到的頁存放在緩衝池中,下一次讀取相同的頁時,首先判...

關於 Mysql innodb的索引

關於innodb的索引,可以分為聚簇索引,輔助索引,都是以b tree 為底層資料結構。聚簇索引 只是資料的儲存方法。以主鍵為key,如果表中沒有主鍵,則會選擇乙個有唯一索引的列作為key,如果都沒有,innodb會為我們建立乙個唯一列作為key。所有的資料都存在葉子節點上,並且是按順序儲存的。如果...

MySQL Innodb 索引的原理

回想四年前,我在學習mysql的索引這塊的時候,老師在講索引的時候,是像下面這麼說的 索引就像一本書的目錄。而當使用者通過索引查詢資料時,就好比使用者通過目錄查詢某章節的某個知識點。這樣就幫助使用者有效地提高了查詢速度。所以,使用索引可以有效地提高資料庫系統的整體效能。嗯,這麼說其實也對。但是呢,大...