之前做了個InnoDB的分享,主要是關(guān)于InnoDB中B+Tree的結(jié)構(gòu)和MVCC的實現(xiàn)。 paper writing services PPT:?BpTree_MVCC 下面把PPT內(nèi)容稍微整理一下。 首先是B+Tree,下面給出InnoDB中B+Tree的結(jié)構(gòu)(via) 有如下特點: 尋道次數(shù)固定,且次數(shù)少(因為樹高度比較
之前做了個InnoDB的分享,主要是關(guān)于InnoDB中B+Tree的結(jié)構(gòu)和MVCC的實現(xiàn)。
PPT:?BpTree_MVCC
下面把PPT內(nèi)容稍微整理一下。
首先是B+Tree,下面給出InnoDB中B+Tree的結(jié)構(gòu)(via)
有如下特點:
這里強烈推薦?B+Tree index structures in InnoDB 這篇文章,詳細(xì)介紹了InnoDB中B+Tree的具體實現(xiàn)結(jié)構(gòu)。
隨后是關(guān)于MVCC。
MVCC是多版本并發(fā)控制,用于在實現(xiàn)事務(wù)操作時,替代單純的讀寫鎖。單純的讀寫鎖會對所有讀過的數(shù)據(jù)加讀寫鎖,讀了就不能寫,寫了就不能讀。
既然是解決讀寫沖突的問題,那何時能寫何時能讀就是要考慮的重點,為此有“隔離級別”的概念。這個概念強調(diào)的就是在什么情況下,允許讀,什么情況下,允許寫。
InnoDB的MVCC支持四種隔離級別,分別是READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。其中最常用的是“READ?COMMITTED:讀已提交”和“REPEATABLE READ:可重復(fù)讀”。
需要注意的是,無論任何隔離級別,一旦某條記錄被UPDATE/DELETE/SELECT FOR UPDATE,即加X鎖后,事務(wù)提交前就不能再被更新(加X鎖)了。
InnoDB是如何實現(xiàn)事務(wù)的多版本呢,我在演講的時候也請出了網(wǎng)易何登成大神的PPT
地址:?InnoDB Transaction Lock and MVCC:微盤地址??Slideshare地址
這個PPT詳細(xì)介紹了MVCC的具體實現(xiàn),包括鎖相關(guān)的實現(xiàn),下面我簡單總結(jié)下重點。
InnoDB通過ReadView(視圖)來實現(xiàn)上述隔離級別。ReadView會記錄當(dāng)前狀態(tài)下:
同時,事務(wù)修改字段時,在修改原來的值的時候,會標(biāo)注當(dāng)前事務(wù)的ID,同時把舊的數(shù)據(jù)和舊的事務(wù)ID放到回滾段。
有了上述兩項操作,那么ReadView的作用就體現(xiàn)出來了,即Select語句讀?。?/p>
同時,任何小于“最小的活躍事務(wù)的事務(wù)ID”的數(shù)據(jù)都可以被回收,因為它們再也不會被讀取到。
因此可以發(fā)現(xiàn),READ?COMMITTED、REPEATABLE READ這兩個級別的差別,就在于ReadView的創(chuàng)建時機。前者再語句開始時創(chuàng)建ReadView,語句結(jié)束后Drop;后者在事務(wù)開始時創(chuàng)建,事務(wù)提交后Drop。即可實現(xiàn)其功能。
要注意的是,即便對于READ?COMMITTED級別,如果語句執(zhí)行過程中又有新的事務(wù)提交,select還是看不到的(極端情況)。
ReadView的存儲結(jié)構(gòu),或者是更深入的研究,可以去看前述的PPT,不再重復(fù)。
其實還分享了關(guān)于回滾段、回滾方式,MySQL的X-commit二段提交,對B+Tree的一些操作,感覺寫字還是有點兒蒼白,況且
Jeremy Cole和何登成的blog和PPT都要詳細(xì)、優(yōu)雅的多,推薦有興趣的同學(xué)去看看。
原文地址:InnoDB中的B+Tree和MVCC, 感謝原作者分享。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com