国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL中大對象的多版本并發(fā)控制詳解

2024-07-25 19:09:13
字體:
供稿:網(wǎng)友

MySQL 8.0:InnoDB中大對象的MVCC

在本文中,我將解釋MySQL InnoDB存儲引擎中大對象(LOB)設(shè)計的多版本并發(fā)控制(MVCC) 。 MySQL 8.0有一個新功能,允許用戶部分更新大型對象,包括JSON文檔 。 使用此部分更新功能,當(dāng)LOB部分更新時,MVCC對LOB的工作方式已發(fā)生變化。 對于正常更新(完整更新),MVCC將像以前的版本一樣工作。 讓我們看一下MVCC在不涉及部分更新時的工作原理,然后考慮對LOB進(jìn)行部分更新的用例。

MVCC 常規(guī)更新

我使用術(shù)語常規(guī)更新來指代不是部分更新的更新。 我將通過一個例子解釋MVCC如何用于常規(guī)更新大對象。 我將為此目的使用以下mtr(1)測試用例:

 create table t1 ( f1 int primary key , f2 longblob ) engine = innodb ;  insert into t1 values ( 1 , repeat ( 'a' , 65536 ) ) ;   start transaction ;  update t1 set f2 = repeat ( 'b' , 65536 ) where f1 = 1 ;   -- echo # Connection con1:  -- 對于使用MySQL客戶端的用戶,可能需要通過另開一個終端窗口建立新鏈接, 下同。 connect ( con1 , localhost , root , , ) ;  -- echo # Must see the old value 'aaaaaaaaaa'  select f1 , right ( f2 , 10 ) from t1 order by f1 ;   -- echo # Connection default:  connection default ;  disconnect con1 ;  commit ;   drop table t1 ; 

為了理解下面的解釋,仔細(xì)理解上述測試用例非常重要。

測試場景如下:

最初,表t1包含單個記錄(R1)。
事務(wù)trx1將記錄更新為新值。
當(dāng)trx1仍處于活動狀態(tài)時,另一個事務(wù)trx2正在讀取記錄。 它將讀取舊值。 

表t1僅包含一個記錄(R1)。 但是trx1和trx2會看到兩個不同的值。 該表實(shí)際上只包含最新值(trx1所見的值),而trx2看到的值或記錄是從撤消日志記錄中獲得的。 讓我們看下面的圖片來更好地理解它。

初始狀態(tài):更新操作之前

下圖顯示了更新操作之前的情況。 撤消日志為空。 表的聚簇索引包含一行。 表中有一個LOB。 聚簇索引記錄包含對LOB的引用。

MySQL,大對象,多版本,并發(fā)控制

最終狀態(tài):更新操作后

現(xiàn)在讓我們看一下更新操作后的情況。

MySQL,大對象,多版本,并發(fā)控制

以下是一些重要的觀察:

用戶表空間中有兩個LOB - 舊的LOB和新的LOB。 舊的LOB只能通過撤消日志訪問。 聚集索引記錄指向新LOB。
更新操作已創(chuàng)建包含更新向量的撤消日志記錄。 此撤消日志記錄指向舊LOB。
聚簇索引記錄通過DB_ROLL_PTR系統(tǒng)列指向撤消日志記錄。 此滾動指針指向撤消日志記錄,該記錄可用于構(gòu)建聚簇索引記錄的先前版本。
撤消記錄不包含LOB本身。 而是它只包含對存儲在用戶表空間中的LOB的引用。
存儲在撤消日志記錄中的LOB引用與存儲在聚簇索引記錄中的LOB引用不同。 

事務(wù)在連接1中采取的步驟如下:

事務(wù)查看R1并確定尚未提交修改聚簇索引記錄的事務(wù)。 這意味著它無法讀取該記錄(因?yàn)槟J(rèn)隔離級別是REPEATABLE READ)。
它查看R1中的DB_ROLL_PTR并找到撤消日志記錄。 使用撤消日志記錄構(gòu)建R1的先前版本。
它讀取了這個構(gòu)建的舊版R1。 請注意,此版本在聚簇索引記錄中不可用。 但它使用撤消記錄即時構(gòu)建。
當(dāng)R1指向新的LOB時,這個構(gòu)造的舊版本的R1指向舊的LOB。 所以結(jié)果包含舊的LOB。 

這是LOB的MVCC在不涉及部分更新時的工作方式。

MVCC部分更新

讓我們看另一個例子,了解MVCC在部分更新的情況下是如何工作的。 我們需要另一個例子,因?yàn)槟壳皟H通過函數(shù)json_set()和json_replace()支持JSON文檔的部分更新。

 create table t2 ( f1 int primary key , j json ) engine = InnoDB ;  set @ elem_a = concat ( '"' , repeat ( 'a' , 200 ) , '"' ) ;  set @ elem_a_with_coma = concat ( @ elem_a , ',' ) ;  set @ json_doc = concat ( "[" , repeat ( @ elem_a_with_coma , 300 ) , @ elem_a , "]" ) ;   insert into t2 ( f1 , j ) values ( 1 , @ json_doc ) ;   start transaction ;  update t2 set j = json_set ( j , '$[200]' , repeat ( 'b' , 200 ) ) where f1 = 1 ;   -- echo # Connection con1:  connect ( con1 , localhost , root , , ) ;  -- echo # Must see the old value 'aaaaaaaaaa...'  select json_extract ( j , '$[200]' ) from t2 ;   -- echo # Connection default:  connection default ;  disconnect con1 ;  commit ; 

該場景與前面的示例相同。 只是longblob字段已更改為JSON文檔。 加載的數(shù)據(jù)也略有不同,以符合JSON格式。

提示 :您可以在上述mtr測試用例(兩者中)中添加語句set debug ='+ d,innodb_lob_print' ,以在服務(wù)器日志文件中打印LOB索引。 LOB索引將在插入后立即打印。 LOB索引將為您提供存儲的LOB對象的結(jié)構(gòu)。
在部分更新操作之前

完全或部分更新操作之前的初始條件是相同的,并且已經(jīng)在上面給出。 但是在下圖中,提供了一些附加信息。

MySQL,大對象,多版本,并發(fā)控制

讓我們看看圖中顯示的其他信息:

存儲在聚簇索引記錄中的LOB引用現(xiàn)在包含LOB版本號v1。 在初始插入操作期間,將其設(shè)置為1,并在每次部分更新時遞增。
每個LOB數(shù)據(jù)頁面在LOB索引中都有一個條目。 每個條目都包含LOB版本信息。 每當(dāng)修改一個LOB數(shù)據(jù)頁時,它將被復(fù)制到具有新數(shù)據(jù)的新LOB數(shù)據(jù)頁中,并且將創(chuàng)建具有遞增的LOB版本號的新LOB索引條目。 

附加信息是LOB版本號。 這在聚集索引記錄中的LOB引用中以及LOB索引的每個條目中都可用。

部分更新操作后

下圖說明了部分更新操作后的情況。

MySQL,大對象,多版本,并發(fā)控制

這里最重要的優(yōu)化是用戶表空間中仍然只有一個LOB。 僅更新需要修改的那些LOB數(shù)據(jù)頁。 部分更新操作后的這個單個LOB包含舊版本和新版本的LOB。 圖中LOB數(shù)據(jù)頁面上的v1和v2標(biāo)簽說明了這一點(diǎn)。

另一個重要的觀察是撤消日志和聚簇索引記錄中的LOB引用指向同一個LOB。 但LOB引用包含不同的版本號。 撤消日志記錄中的LOB引用包含v1(舊版本號),聚簇索引記錄中的LOB引用包含新版本號v2。

LOB版本號的目的

如上所示,具有不同版本號的不同LOB引用指向相同的LOB。 單個LOB包含來自不同版本的部分。 LOB版本號用于獲取各種LOB引用指向的正確版本。 在本節(jié)中,我們將了解如何完成此操作。

LOB索引包含組成LOB的LOB頁面列表。 它包含LOB數(shù)據(jù)頁的頁碼,每個LOB數(shù)據(jù)頁包含的數(shù)據(jù)量以及版本號。 此列表的每個節(jié)點(diǎn)稱為LOB索引條目。 每個LOB索引條目都包含舊版本的列表。 讓我們看一個說明上述部分更新測試用例的結(jié)構(gòu)的圖。

MySQL,大對象,多版本,并發(fā)控制

最初,在完成部分更新之前,LOB索引總共包含4個條目。 四個條目的頁碼是5,6,7和8.沒有LOB索引條目具有舊版本。 所有四個條目的版本號均為1。

部分更新完成后,我們注意到頁碼9已替換頁碼7,頁碼7現(xiàn)在被視為頁碼9的舊版本。頁碼9的版本號為2,并且頁碼7的版本號為1。

部分更新完成后,當(dāng)通過版本號為1的LOB引用訪問LOB時,將查看第5頁的第一個索引條目。 它的版本號為1.如果索引條目中的版本號小于或等于 LOB引用中的版本號,則將讀取該條目。 因此,將讀取第5頁。 然后將查看頁碼為6的索引條目。 它的版本號為1,因此將被讀取。 然后將查看頁碼為9的索引條目。 它的版本號為2.但是lob引用的版本號為1.如果索引條目中的版本號大于LOB引用中的版本號,則不會讀取該條目。 由于頁碼9的條目具有版本2,因此將查看其舊版本。 將檢查頁碼為7的索引條目。 它的版本號為1,因此將被讀取。 在此之后,將檢查頁碼為8的索引條目。 它的版本號為1,因此也將被讀取。 這是訪問舊版LOB的方式。

部分更新完成后,當(dāng)通過版本號為2的LOB引用訪問LOB時,將查看第5頁的第一個索引條目。 它的版本號為1.如果索引條目中的版本號小于或等于LOB引用中的版本號,則將讀取該條目。 因此它將按順序讀取頁碼5,6,9,8。 由于版本號始終<= 2,因此無需使用舊版本訪問頁碼7。

需要記住的一點(diǎn)是LOB在InnoDB中不是獨(dú)立存在的。 它被視為聚簇索引記錄的擴(kuò)展。LOB對事務(wù)是否可見并不由LOB模塊處理。 LOB模塊只是處理聚簇索引記錄。 如果事務(wù)訪問LOB,則意味著它已經(jīng)在聚簇索引記錄中的DB_TRX_ID的幫助下確定它可以查看LOB(而不是LOB的特定版本)。 所以我們不擔(dān)心LOB模塊中的那個方面。 我們只專注于為給定的LOB版本號提供正確的內(nèi)容。

結(jié)論

在本文中,我們了解了如何在InnoDB中為大對象完成MVCC。 當(dāng)對LOB進(jìn)行部分更新時,多個LOB引用可以指向同一個LOB。 但他們將擁有不同的版本號。 使用這些LOB版本號,可以訪問正確的LOB內(nèi)容。

希望您發(fā)現(xiàn)此信息有用。

謝謝你使用MySQL!

注釋:

(1) Mtr即Mini-transaction的縮寫,字面意思小事物,相對邏輯事物而言,我們把它稱作物理事物。屬于Innodb存儲引擎的底層模塊。主要用于鎖和日志信息。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产三级在线观看| 午夜av电影| 久热中文字幕| 精品欧美色视频网站在线观看| 人人九九精品| 夜夜爽夜夜操| 伊人中文字幕在线| 18成年在线观看| 精品美女在线观看视频在线观看 | 九九热免费视频| av在线免费播放网站| 在线中文免费视频| 精品视频在线一区二区| 国产精品777一区二区| 最新黄网在线观看| 国产性网软件大全| 国产精品伦一区二区三区级视频频| 国产美女在线播放| 国产精品探花在线| 99热在线免费播放| 国产欧美日韩第一页| 国产精品视频一区二区免费不卡 | www免费在线观看视频| 精精国产xxxx视频在线中文版| 国产精品久久久久久久牛牛| 国产三级自拍| 亚洲视频日韩| 丁香花在线电影小说观看 | 99热国产在线| 波多野结衣久久高清免费| 亚洲男人网站| 黄色av免费看| 国产探花在线观看| 伊人中文字幕在线| 高潮毛片在线观看| 国产激情小视频在线| 伊人网在线视频| 亚洲第一区视频| 丁香花在线电影| 中文字幕av高清在线观看| 在线观看的av网站| 午夜国产在线| 亚洲精品少妇久久久久久| 开心丁香婷婷深爱五月| 国产区高清在线| 四虎久久影院| 国产小视频在线| 在线观看免费观看在线91| 亚洲xxxxxx| 中文字幕在线观看av| 国产夫妻视频| 激情四房婷婷| 亚洲久草视频| 国产网站免费观看| 免费av在线| 97在线免费| 国产视频xxx| 国产中文在线视频| 99热99re6国产在线播放| 天天操人人干| 九九视频在线播放| www.91在线播放| 亚洲an天堂an在线观看| av黄色在线观看| 在线国产福利网站| 在线观看免费视频一区二区三区| 国产视频福利在线| 国产亚洲精品一区二区在线观看| 免费国产视频| www.久草.com| 超碰国产在线| 久久综合第一页| 成人午夜无人区一区二区| 人成在线免费视频| 免费a级人成a大片在线观看| 怡红院av在线| av在线第一页| 超碰免费在线播放| 国精一区二区三区| 国内精品免费一区二区三区| 国产你懂的在线观看| 黄网站app在线观看下载视频大全官网| 伊人影院在线播放| www在线观看播放免费视频日本| 白浆爆出在线观看| 黄色电影网站在线观看| 国产中文字幕av| 国产精品视频白浆合集| 国产高清免费av在线| 在线亚洲不卡| 黄色国产网站在线播放| 国产一级在线观看www色| 最新中文字幕在线| 91九色在线看| 日本高清中文字幕在线| 中文字幕网在线| 中文国产字幕在线观看| www免费在线观看视频| 99热在线观看免费| av免费在线免费| 尤物网站在线| 在线观看免费观看在线91| 国产在线二区| 中文av资源在线| 福利在线观看| 亚洲国产成人综合| 国产激情三区| 最新av中文字幕| www.久草.com| 亚洲欧美精品日韩欧美| 日本中文字幕在线播放| 亚洲国产成人综合| 国产高清av| 日本中文字幕在线视频| 亚洲电影视频在线| 91在线高清| 国产二区三区在线| 国产网站在线免费观看| 欧美啪啪精品| 亚洲精品影院在线| 在线亚洲不卡| 在线视频中文字幕久| 国产黄色片大全| 国产美女在线播放| 狠狠操视频网| 国产美女极品在线| 国内精品不卡| 青草视频在线播放| 色中文字幕在线| sese在线视频| 青青草在线免费观看| 在线国产三级| 日韩黄色成人| 免费观看v片在线观看| 九九热在线观看视频| 免费精品国产自产拍在| 天堂网中文在线| 亚洲sss视频| 九九精品九九| 国产一二在线观看| 国产日韩精品在线看| 国产精品9区| www.操操操.com| 日韩av成人| 中文字幕2019第三页| 天天激情综合| 中文字幕专区| 亚洲最新永久观看在线| 四虎影院成人| 国产小视频免费在线观看| 国产黄网站在线观看| а√天堂8资源在线官网| 国产九九九九| 国产高清在线| 激情四房婷婷| 亚洲尤物在线视频| 国产亚洲依依| 久久精品免视着国产成人| 五月天天在线| www.五月色.com| 国产成人精品18| 黄色毛片在线观看| 亚洲人成电影| 国产超级va在线视频| 久久精品视频观看| 91中文字幕| 国产羞羞视频在线观看| 欧美日韩国产亚洲沙发| 国产黄色一级片| 黄网站在线观看高清免费| 97在线免费| 国产精品亚洲色图| 久久久久久久久免费视频| 在线伊人免费视频| 国产对白叫床清晰在线播放| 国产专区在线播放| 色悠久久久久综合网小说| 69堂视频在线观看国产| 国产精品外围在线观看| 国产在线拍揄自揄拍视频| 欧美日韩久久中文字幕| 亚洲国产精品区| www.香蕉视频在线观看| 在线观看午夜av| 99久久免费精品国产免费| 国产精彩视频在线观看免费蜜芽| 国产乱码在线| 国产天堂视频| 92国产在线视频| 伊人狠狠av| 亚洲精品在线播放视频| 亚洲午夜久久久久中文字幕| 夜色资源网av在先锋网站观看| 在线激情小视频| 一本大道五月香蕉| 麻豆视频国产| 丁香在线视频| 精品麻豆视频| 欧美国产中文| 中文字幕在线免费看|