innodb是mysql5.5之後預設支援的表儲存引擎。
其特點是:行鎖設計,支援mvvc,支援外來鍵,提供一致性非鎖定讀。
innodb儲存引擎有多個記憶體塊,負責一下工作:
維護有所程序和執行緒需要訪問的多個內部資料結構
快取磁碟上的資料,方便快速地讀取,同時在對磁碟檔案的資料修改之前在這裡快取
重做日誌緩衝。
後台執行緒的主要作用是負責重新整理記憶體池中的資料,保證緩衝池中的記憶體緩衝的是最新的資料。此外將已修改的資料檔案重新整理到磁碟檔案,同時保證在資料庫發生異常的情況下innodb能恢復到正常水平。
後台執行緒:
master thread:核心後台執行緒,主要負責將緩衝池中的資料非同步重新整理到磁碟,保證資料的一致性,包括髒頁的重新整理、合併插入緩衝、undo頁的**等
io thread:對來io請求進行處理,提高資料庫的效能。主要負責io請求的**,有四種:write,read,insert buffer,log io thread。
purge thread:事物提交後,其所使用的undolog可能不再被需要,所以要進行**已經使用並且分配的undo頁。在1.1之前purge操作需要依賴master thread進行完成,之後的版本可以自己進行處理,獨自使用乙個執行緒。
page cleaner thread:在1.2版本之後引入的,其作用是將之前版本的髒頁的重新整理操作都放入到單獨的執行緒中來完成,而其目的是為了減輕原master thread 帶來的工作和對於使用者查詢執行緒的堵塞。
記憶體:緩衝池:儲存引擎是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理,因此可將其視為基於磁碟的資料庫系統。
快取其實的意義是通過記憶體資料來彌補硬碟速度。在資料庫中進行讀取頁的操作,首先將磁碟讀到的頁存放到緩衝區中,這個過程稱之為fix過程,下次再次讀取頁的時候可以先查詢緩衝區有沒有對應的頁,如果沒有的話再進入磁碟中進行讀取。
對於修改操作,也是先修改緩衝區中的頁,然後把頁再按照一定頻率重新整理到磁碟中去,具體操作是通過checkpoint的機制重新整理回磁碟。
緩衝池中快取的資料頁型別有:
資料庫中的緩衝池是通過lru(最近最少使用)演算法進行管理的,即最頻繁使用的頁在lru列表的前段,而最少使用的也在lru頁的尾端。當緩衝池不能存放讀取到頁的時,將首先釋放lru列表中尾端的頁。
在innodb儲存引擎中,緩衝池中頁的大小預設大小為16kb,同樣使用lru演算法對快取池進行管理。從磁碟中新讀取到的頁會放入lru列表的midpoint位置。在這個位置之前的都是最活躍的熱點資料,之後都是old資料。(midpoint是因為有些操作例如索引或者資料的掃瞄需要訪問到表中許多頁這些頁面並不是確實需要的,可能會將真正的熱點資料頁進行後退,最後被移除)
lru列表用來管理已經讀取到的頁,當資料庫剛剛啟動的時候,這個lru列表是空的,這時候的頁都放置在free list中,當需要從緩衝區進行分頁的時候,首先從free list中進行查詢是否有空白頁,若有空白則從free list中刪除這個頁放入到lru list中
從1.0版本之後開始支援壓縮頁的功能,原來16kb的可以壓縮到1,2,4,8kb。對於非16kb的頁面是通過unzip_lru列表進行管理的,unzip_lru列表對不同的壓縮頁大小的頁進行管理:
檢查是否有4kb的頁,有就分配
沒有就檢查8kb,有8kb的就是分成2個4kb
沒有8kb就申請16kb的,分成2個4kb,1個8kb。
額外的記憶體池:
對記憶體的管理是通過一種稱為記憶體堆的方式進行的,在對一些資料結構本身的記憶體進行分配時,需要從額外的記憶體池中進行申請,當不夠時候,會從緩衝池中進行申請。但是每個緩衝池中的幀緩衝還有對應的緩衝控制物件,這些物件記錄了一些諸如lru、鎖、等待等資訊。
checkpoint技術:
緩衝池的目的是為了提高cpu速度與磁碟速度的鴻溝,所有表的操作都是最先在緩衝池中完成。如果有一條dml語句改變了乙個表中的記錄,那麼這個過程中的頁其實是髒的,資料庫需要將最新版本的也從緩衝池重新整理到磁碟。
如果每一次改變都要進行提交,那麼開銷會很大,所以一般會使用一種write ahead log策略,當事物提交的時候,先寫日誌再進行修改。日誌可以幫助進行資料的恢復。
checkpoint技術主要是為了解決以下幾個問題:
縮短資料庫的恢復時間
緩衝池不夠用時,將髒頁重新整理到磁碟
重做日誌不可用時,重新整理髒頁
此外,當資料庫緩衝池不夠用,根據lru演算法會移除一些不常用的頁,若此時的頁為髒頁則需要強制執行checkpoint。
在這本書中作者把checkpoint分成了兩種,sharp checkpoint和fuzzy checkpoint
sharp checkpoint指:在資料庫關閉的時候將所有的髒頁進行重新整理
fuzzy checkpoint指:在資料庫執行時候重新整理,但是只重新整理一部分的髒頁
具體的fuzzy checkpoint可以分成4種:
master thread checkpoint,在master thread的過程中發生,以1~10s的速度從緩衝池中的髒頁進行重新整理回磁碟,而且這個是非同步的操作。
flush_lru_list checkpoint innodb引擎需要差不多100個空白頁進行使用(這是前提),進行操作之前需要檢查(tm的1.1x之前),如果沒有100個空白頁就需要進行對後面的一部分髒頁進行checkpoint,這就是flush_lru_list checkpoint
async/sync flush checkpoint 是重做日誌中不可用的情況,這時需要強制將一些頁重新整理回磁碟。這時候的髒頁是從髒頁列表中選取的,若將已經寫入到重寫日誌中帶lsn標記為redo_lsn。
最後一種情況dirty page too much看名字就知道了,太多的髒頁進行了重新整理。
master thread工作方式
1.0.x之間的master thread
是最高執行緒優先級別,內部由多個迴圈組成:主鍵環、後台迴圈、重新整理迴圈
、暫停迴圈。master thread會根據情況進行切換。
主迴圈是通過thread sleep來實現,這意味著每秒一次或者每10秒一次的操作其實是不準確的。在負載很大的情況下回有延遲,只能說大概在這個頻率下。
每一秒的操作包括:日誌緩衝重新整理到磁碟,即使這個事務還沒有提交。合併插入緩衝。至多重新整理100個innodb的緩衝池中的髒頁到磁碟。如果沒有使用者活動,切換到background loop
即使沒有事務提交,引擎依然會重做日誌的緩衝,將內容重新整理到重做日誌。
合併插入緩衝不是每一次都發生會先去判斷,前1秒的io運算元據,如果小於5次就會發生,因為它認為當前是適合進行合併插入的。
innodb關鍵特性
插入緩衝、兩次寫
、自適應hash索引
、非同步io
、重新整理相鄰頁
測試工程師VS開發工程師 打敗開發工程師
測試空間旗下大頭針 出品 今天賀老師組織了一次內部培訓,目的是為了使我們帶領的兩位測試人員盡快的進入公司的專案組 參加部門會議的大多都是新員工,他們公司剛剛找了乙個專門開發 的程式設計師。首先賀老師給我們講解了dms的體系結構。公司產品結構挺有意思的,有終端機 支援gprs的sim卡,gis卡,gp...
devops工程師 DevOps工程師的認證
devops工程師 devops的團隊欣賞使用devops的過程 尤其是在多 和混合雲基礎架構,原因是多方面的。一方面,devops打破了障礙,使敏捷軟體開發和it運營的持續交付成為可能。它在企業中也很流行,因為它可以通過數位化轉型幫助加速業務成果。隨著敏捷實踐和流程深入企業內部,具有擴充套件框架知...
工程師心聲
悲情竹科男網路寫續集 迴響熱烈 更新日期 2007 12 01 04 39 馬瑞君 新竹報導 科技新貴是不是真的是人人稱羨有名車豪宅 大批 分紅 女生排隊搶著要的 黃金單身漢 一名竹科工程師的竹科單身漢心聲兩年前在網路上造成轟動,兩年後他再寫續集,同樣是單身 沒有情人陪伴,被極度壓榨 沒有目標重心的...