日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》

發(fā)布時(shí)間:2023/12/1 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

    • RowIterator
      • Init()
      • Read()
      • SetNullRowFlag()
      • UnlockRow()
      • StartPSIBatchMode()
      • EndPSIBatchModeIfStarted()
      • real_iterator()

RowIterator

使用選定的訪問(wèn)方法讀取單個(gè)表的上下文:索引讀取,掃描等,緩存的使用等。
它主要是用作接口,但也包含一些私有成員函數(shù),這些函數(shù)對(duì)于許多實(shí)現(xiàn)都是有用的,例如錯(cuò)誤處理。
RowIterator是一個(gè)簡(jiǎn)單的迭代器。您對(duì)其進(jìn)行初始化,然后一次讀取一個(gè)記錄,直到Read()返回EOF。如果需要,RowIterator可以從其他Iterators讀取數(shù)據(jù),例如SortingIterator,它從另一個(gè)RowIterator接收記錄并對(duì)其進(jìn)行排序。
抽象并不完全緊密。特別是,它仍然留給TABLE一些細(xì)節(jié),例如要讀取的列(read_set)。這意味著可能很難對(duì)兩個(gè)表的聯(lián)接進(jìn)行排序。

使用方法:

unique_ptr<RowIterator> iterator(new ...); if (iterator->Init())return true; while (iterator->Read() == 0) {... }

Init()

初始化或重新初始化迭代器。
在嘗試Read()之前,必須始終調(diào)用Init()(但是Init()并不意味著Read())。
您可以多次調(diào)用Init();隨后的調(diào)用將使迭代器倒回(或重新定位,具體取決于迭代器是否采用TABLE_REF),并允許您重新讀取記錄。

Read()

讀一行。
該行數(shù)據(jù)實(shí)際上不是從函數(shù)返回的;它被放在表的記錄緩沖區(qū)中(如果有連接,則放在表中),即table-> records [0]。

SetNullRowFlag()

將當(dāng)前行緩沖區(qū)標(biāo)記為包含或不包含NULL行,這樣,如果您從中讀取并且標(biāo)志為true,則無(wú)論緩沖區(qū)中實(shí)際上有什么(通常是一些舊的剩余行),您都只會(huì)得到NULL。
當(dāng)?shù)鳑](méi)有產(chǎn)生任何行并且我們需要產(chǎn)生一個(gè)NULL補(bǔ)充行時(shí),它用于外部聯(lián)接。Init()或Read()不一定會(huì)重置此標(biāo)志,因此,如果您將其設(shè)置為true,請(qǐng)確保在需要時(shí)也將其設(shè)置為false。
注意,可以在不首先調(diào)用Init()的情況下調(diào)用它。

UnlockRow()

在一些特定的查詢(xún)中,比如SELECT FOR UPDATE, UPDATE or DELETE查詢(xún),正在讀取的行將在上面上鎖。這意味著鎖的設(shè)置取決于優(yōu)化器是否選擇了一個(gè)表掃描或者使用索引。
但是在某些事務(wù)隔離級(jí)別下(讀取或提交),當(dāng)且僅當(dāng)行因?yàn)閃HERE這個(gè)謂詞失敗,只有返回的行受到保護(hù),那些沒(méi)有返回的行就不會(huì)受到保護(hù)了。
所以如果Read()返回一行數(shù)據(jù),如果不使用它,就應(yīng)該Read()之后調(diào)用UnlockRow(),它將允許存儲(chǔ)引擎在這種情況下釋放行鎖。

StartPSIBatchMode()

啟動(dòng)性能模式批處理模式。
PFS批處理模式可以減輕性能模式的開(kāi)銷(xiāo),該性能模式通常應(yīng)用于整個(gè)聯(lián)接的最內(nèi)表。
如果在掃描表之前先啟動(dòng)它,然后再結(jié)束它,則整個(gè)處理程序調(diào)用集將作為一組,并且成本將平均分配。這樣可以減少計(jì)時(shí)器開(kāi)銷(xiāo)。
如果啟動(dòng)PFS批處理模式,則還必須注意在掃描結(jié)束時(shí)以一種另一種方式結(jié)束它。請(qǐng)注意,即使查詢(xún)突然結(jié)束(達(dá)到LIMIT或者發(fā)生錯(cuò)誤),也必須結(jié)束它。最簡(jiǎn)單的解決方法就是在掃描結(jié)束時(shí)在根迭代器上簡(jiǎn)單調(diào)用EndPSIBatchModeIfStarted()。
開(kāi)始批處理和結(jié)束的規(guī)則是:
1、如果迭代器只有一個(gè)子類(lèi),則將所有StartPSIBatchMode()的調(diào)用轉(zhuǎn)發(fā)給它。
2、如果驅(qū)動(dòng)迭代器(使用for循環(huán)或者類(lèi)似的方法讀取行),需要使用PFSBatchMode
3、如果迭代器有多個(gè)子類(lèi),忽略StartPSIBatchMode()的調(diào)用,并且根據(jù)需要自行處理批處理模式
所以,在掃描單個(gè)表時(shí),通常會(huì)為該表激活批處理模式,因?yàn)槲覀冊(cè)诟魃险{(diào)用該函數(shù),并且一直向下傳入表迭代器。但是調(diào)用后,該調(diào)用將被忽略,并且迭代器需要根據(jù)需要自行激活批處理模式。

EndPSIBatchModeIfStarted()

結(jié)束性能模式批處理模式
具有子級(jí)的迭代器(復(fù)合迭代器)必須將該函數(shù)調(diào)用轉(zhuǎn)發(fā)給所有子迭代器。這樣可以確保在對(duì)根迭代器進(jìn)行這樣的調(diào)用之后,所有處理程序都退出批處理模式。

real_iterator()

如果該迭代器包裝了其他迭代器,需要將該迭代器向下轉(zhuǎn)換為特定的迭代器類(lèi)型。

總結(jié)

以上是生活随笔為你收集整理的《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。