purge執行緒用於最終完成delete和update操作。
在purge的過程中,innodb儲存引擎收看從history list中找到第乙個需要被清理的記錄。清理之後,會在其所在的頁中集訓尋找是否存在可以被清理的記錄。前面我們說過,innodb儲存引擎允許乙個頁中儲存多個undo資訊。如果發現不能的事務undo資訊,那麼會返回history list中查詢下乙個可清理的記錄。這種做法能避免大量的隨機讀取操作,提公升purge效率。
全域性動態引數innodb_purge_batch_size用來設定每次purge操作需要清理的undo page的數量。在innodb v1.2之前預設值20,之後預設值為300.該值越大,每次回首的undo page越多,可供重用的undo page就越多。但是值設定過大,會導致cpu和磁碟io過於集中對undo log處理,效能反而下降。這也是mysql資料庫手冊推薦普通使用者無需調整該引數的原因。
全域性動態引數innodb_max_purge_lag用來控制history list的長度。如果長度大於該引數,其會「延緩」dmlcaozuo .預設值為0,表示對history list不做任何限制。
「延緩」操作的時間單位是毫秒。而延緩的物件則是「行」。例如,事務更新5行資料,每行資料都會被延緩。
v1.2開始引入了全域性動態引數innodb_max_purge_lag_delay,用來控制延緩的最大號描述。它能避免通過公式計算的延緩時間過大,導致其他sql執行緒出現無限制的等待。
group commit功能一次fsync可以重新整理確保多個事務日誌被寫入。這可以大大提公升效能。
對於innodb儲存引擎來說,事務提交會進行兩個階段的操作:
1)修改記憶體中事務對應的資訊,並且將日誌寫入重做日誌緩衝。
2)呼叫fsync將確保日誌都從重做日誌緩衝寫入磁碟。
步驟2相對步驟1是乙個緩慢的過程。因此,group commit可以大大提公升效能。
在innodb v1.2之前,開啟二進位制日誌後,innodb儲存引擎的group commitgone能會失效,從而導致效能下降。
原因是mysql資料庫**二進位制日誌寫入順序和innodb層的事務提交順序一致,mysql資料庫內部使用了prepare_commit_mutex這個鎖。啟用這個鎖後,步驟1不可以在其他事務執行步驟2時執行,從而導致了group commit失效。
mysql v5.6採用了blgc實現了上述問題的解決。mysql資料庫上層進行提交時,按順序將事務房屋乙個佇列,佇列中第乙個事務為leader,其他的為follower。 blgc步驟分為三個階段;
1)flush階段,將每個事務的二進位制日誌寫入記憶體
2)sync階段,將記憶體中的二進位制重新整理到磁碟。如果佇列中有多個事務,那麼一次fsync操作完成二進位制的寫入。
3)commit階段,leader根據順序屌用儲存引擎事務的提交,innodb儲存引擎支援group commit。
當事務僅有乙個的時候,效果可能不明顯,甚至比之前還差些。當提交的事務越來越多時,gourp commit效果越明顯。
MySQL事務簡述(六)
事務的統計主要是看tps,它是question per second的縮寫,代表每秒處理事務的能力。這裡的事務包括提交和回滾的兩種型別。不過無論是哪一種,只有顯示宣告的事務才會被統計。公式 com commit com rollock time iso和anis sql標準制定了4種事務隔離級別,它...
簡述事務的四個特性。
事務 是資料庫操作的最小工作單元,是作為單個邏輯工作單元執行的一系列操作 這些操作作為乙個整體一起向系統提交,要麼都執行 要麼都不執行 事務是一組不可再分割的操作集合 工作邏輯單元 事務的四大特性 事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做,或者說 原子性是指事務包含的所有操...
redis 事務簡述
一 什麼是redis事務?一組命令的執行看作乙個集體,在這執行中間,這一組命令按順序依次執行,中間不被打斷或干擾。乙個佇列中一次性,順序性,排他性的執行一系列命令。二 事務的基本操作 開啟事務 multi 作用 開啟事務,此條命令執行,後續命令均加入事務中。執行事務 exec 事務結束位置,即執行事...