溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MYSQL MVCC的實現(xiàn)原理

發(fā)布時間:2021-09-14 11:17:58 來源:億速云 閱讀:150 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“MYSQL MVCC的實現(xiàn)原理”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MYSQL MVCC的實現(xiàn)原理”吧!

MVCC 首先是為并發(fā)而產(chǎn)生的(MVCC  multi version Concurrency control),而因為要并發(fā)事務(wù),使用了2PL 2段鎖,下面畫一個圖來看看兩段鎖

2 Phase lock 包含兩個區(qū)段,擴(kuò)展和收縮,而在實際當(dāng)中這個而兩個階段其實可以通過commit  rollback來進(jìn)行區(qū)分,在此之前都是 Growing 階段,在這之后都就屬于shrink 了。

MYSQL MVCC的實現(xiàn)原理

而基于兩段鎖的原理,就產(chǎn)生最初的兩種鎖  S  X 鎖,S 鎖用于讀,在記錄被加載S 鎖的時候,是不能進(jìn)行相關(guān)記錄行的數(shù)據(jù)更新的,但可以添加其他S鎖進(jìn)行數(shù)據(jù)的讀取, X 鎖則是在記錄更新時,不能有其他X 鎖,或S鎖在此記錄上加鎖。

而這樣的鎖的設(shè)置,就引起一些爭論點,使用這樣的方式的數(shù)據(jù)庫的性能低下。那如何能在此理論下,提出一個能提升系統(tǒng)性能的方法,就變得重要了。

開發(fā)人員提出了,多版本控制的方法來降低由于鎖的問題,而產(chǎn)生的性能問題,這就是 MVCC 的由來。

對于多版本的控制,來說在設(shè)計的時候回會在每行記錄中增加三個隱藏的字段, DB_TRX_ID  用來記錄這一行的的事務(wù) 當(dāng)前使用它的事務(wù)ID , DB_ROLL_PTR 則是記錄這條記錄與UNDO 空間記錄之間的關(guān)系,好在記錄回滾的時候,映射出回滾段與記錄之間的關(guān)系。

MYSQL MVCC的實現(xiàn)原理

其中 DB_TRX_ID 是保留事務(wù)最新的 ID 號,而 DB_ROLL_PTR 則是指向UNDO LOG 中修改行中被修改前的信息。(這不就有兩個版本了,1 新的修改的記錄, 2 沒被修改的記錄)多版本控制僅僅在  RR , RC 兩個MVCC 中進(jìn)行支持。

在InnoDB多版本控制方案中,當(dāng)您使用SQL語句刪除一行時,它不會立即從數(shù)據(jù)庫中物理刪除。InnoDB只有在丟棄為刪除而編寫的update undo日志記錄時,才會物理地刪除相應(yīng)的行及其索引記錄。這個刪除操作稱為清除,它非???,通常使用與執(zhí)行刪除操作的SQL語句相同的時間順序。

從中我們可以推出,UNDO LOG 一定是要在事務(wù)commit前進(jìn)行的,

1  數(shù)據(jù)提出修改

2  將數(shù)據(jù)修改前的信息刷新到 UNDO LOG 

3  更新要更新的數(shù)據(jù)

4  將UNDO LOG 的信息落到磁盤中

5  BINLOG 記錄

6  事務(wù)提交

注:這里未涉及 REDO LOG  以及各種BUFFER 的討論

在多版本控制中,聚集索引和secondary INDEX 之間的數(shù)據(jù)更新是不同的,更新secondary索引列時,將刪除舊的輔助索引記錄,插入新記錄,并最終清除刪除標(biāo)記的記錄。二級索引記錄被刪除或二級索引頁被update的事務(wù)更新時,InnoDB在聚集索引中查找數(shù)據(jù)庫記錄。在聚集索引中,檢查記錄的DB_TRX_ID,如果在讀取事務(wù)啟動后修改了記錄,則從undo日志中檢索記錄的正確版本。

所以在多版本控制中,UNDO LOG 起到不可替代的作用,在事務(wù)未提交,中進(jìn)行數(shù)據(jù)的讀取是,UNDO LOG 將提供當(dāng)時的記錄信息,而表中的行中的隱藏字段將對多版本的控制是一個關(guān)鍵的設(shè)計。

同時如果一次進(jìn)行的事務(wù)比較大,例如UPDATE 就要占用更大的UNDO LOG 的空間,如果更新的事務(wù)的大小,頻次過多,還可能引起整體的數(shù)據(jù)性能低下,所以控制事務(wù)的大小對整體的系統(tǒng)的性能是至關(guān)重要的。

而要說 MVCC 最大的初衷,個人認(rèn)為

1   讀不影響寫

2   寫不影響讀

是MVCC 最要實現(xiàn)的功能。

感謝各位的閱讀,以上就是“MYSQL MVCC的實現(xiàn)原理”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MYSQL MVCC的實現(xiàn)原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI