您好,登錄后才能下訂單哦!
這篇文章主要講解了“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 了。
而基于兩段鎖的原理,就產(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)系。
其中 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)注!
免責(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)容。