《MySQL 8.0.22執行器源碼分析(3.1)關于RowIterator》

目錄

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

RowIterator

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

使用方法:

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

Init()

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

Read()

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

SetNullRowFlag()

將當前行緩沖區標記為包含或不包含NULL行,這樣,如果您從中讀取并且標志為true,則無論緩沖區中實際上有什么(通常是一些舊的剩余行),您都只會得到NULL。
當迭代器沒有產生任何行并且我們需要產生一個NULL補充行時,它用于外部聯接。Init()或Read()不一定會重置此標志,因此,如果您將其設置為true,請確保在需要時也將其設置為false。
注意,可以在不首先調用Init()的情況下調用它。

UnlockRow()

在一些特定的查詢中,比如SELECT FOR UPDATE, UPDATE or DELETE查詢,正在讀取的行將在上面上鎖。這意味著鎖的設置取決于優化器是否選擇了一個表掃描或者使用索引。
但是在某些事務隔離級別下(讀取或提交),當且僅當行因為WHERE這個謂詞失敗,只有返回的行受到保護,那些沒有返回的行就不會受到保護了。
所以如果Read()返回一行數據,如果不使用它,就應該Read()之后調用UnlockRow(),它將允許存儲引擎在這種情況下釋放行鎖。

StartPSIBatchMode()

啟動性能模式批處理模式。
PFS批處理模式可以減輕性能模式的開銷,該性能模式通常應用于整個聯接的最內表。
如果在掃描表之前先啟動它,然后再結束它,則整個處理程序調用集將作為一組,并且成本將平均分配。這樣可以減少計時器開銷。
如果啟動PFS批處理模式,則還必須注意在掃描結束時以一種另一種方式結束它。請注意,即使查詢突然結束(達到LIMIT或者發生錯誤),也必須結束它。最簡單的解決方法就是在掃描結束時在根迭代器上簡單調用EndPSIBatchModeIfStarted()。
開始批處理和結束的規則是:
1、如果迭代器只有一個子類,則將所有StartPSIBatchMode()的調用轉發給它。
2、如果驅動迭代器(使用for循環或者類似的方法讀取行),需要使用PFSBatchMode
3、如果迭代器有多個子類,忽略StartPSIBatchMode()的調用,并且根據需要自行處理批處理模式
所以,在掃描單個表時,通常會為該表激活批處理模式,因為我們在根迭代器上調用該函數,并且一直向下傳入表迭代器。但是調用后,該調用將被忽略,并且迭代器需要根據需要自行激活批處理模式。

EndPSIBatchModeIfStarted()

結束性能模式批處理模式
具有子級的迭代器(復合迭代器)必須將該函數調用轉發給所有子迭代器。這樣可以確保在對根迭代器進行這樣的調用之后,所有處理程序都退出批處理模式。

real_iterator()

如果該迭代器包裝了其他迭代器,需要將該迭代器向下轉換為特定的迭代器類型。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hdu 2432法里數列

這題本來完全沒思路的&#xff0c;后來想一想&#xff0c;要不打個表找找規律吧。于是打了個表&#xff0c;真找到規律了。。。 打表的代碼如下&#xff1a; int n; void dfs(int x1, int y1, int x2, int y2) {if (y1 y2 < n) {dfs(x1, y1, x1 x2, y1 y2);printf("…

python學習筆記四——數據類型

1.數字類型&#xff1a; 2.字符串類型&#xff1a; 切片&#xff1a;a[m:n:s] m:起始值 n:結束值&#xff08;不包括n&#xff09; s:步長&#xff0c;負數表示從后向前取值 3.序列&#xff1a;列表&#xff0c;元組和字符串都是序列 序列的兩個主要特點是索引操作符和切片…

小狐貍ChatGPT系統 不同老版本升級至新版數據庫結構同步教程

最新版2.6.7下載&#xff1a;https://download.csdn.net/download/mo3408/88656497 小狐貍GPT付費體驗系統如何升級&#xff0c;該系統更新比較頻繁&#xff0c;也造成了特別有用戶數據情況下升級時麻煩&#xff0c;特別針對會員關心的問題出一篇操作教程&#xff0c;本次教程…

《MySQL 8.0.22執行器源碼分析(3.2)關于HashJoinIterator》

在本文章之前&#xff0c;應該了解的概念&#xff1a; 連接的一些概念、NLJ、BNL、HashJoin算法。 目錄關于join連接probe行保存概念Hashjoin執行流程&#xff08;十分重要&#xff09;HashJoinIterator成員函數講解1、BuildHashTable2、ReadNextHashJoinChunk3、ReadRowFromPr…

json 語法_JSON的基本語法

json 語法JSON which stands for JavaScript Object Notation is a lightweight readable data format that is structurally similar to a JavaScript object much like its name suggests. 代表JavaScript Object Notation的 JSON是一種輕量級的可讀數據格式&#xff0c;其結…

RFC3261(17 事務)

SIP是一個基于事務處理的協議&#xff1a;部件之間的交互是通過一系列相互獨立的消息交換來完成的。特別是&#xff0c;一個SIP 事務由一個單個請求和這個請求的所有應答組成&#xff0c;這些應答包括了零個或者多個臨時應答以及一個或者多個終結應答。在事務中&#xff0c;當請…

HDUOJ---1754 I Hate It (線段樹之單點更新查區間最大值)

I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33469 Accepted Submission(s): 13168 Problem Description很多學校流行一種比較的習慣。老師們很喜歡詢問&#xff0c;從某某到某某當中&#xff0c;…

WEG的完整形式是什么?

WEG&#xff1a;邪惡邪惡的咧嘴 (WEG: Wicked Evil Grin) WEG is an abbreviation of "Wicked Evil Grin". WEG是“ Wicked Evil Grin”的縮寫 。 It is also known as EWG (Evil Wicked Grin) "Grin" refers to a broad smile. "Wicked" refer…

C# 把數字轉換成鏈表

例如&#xff1a;123456轉換成 1 -> 2 -> 3-> 4-> 5-> 6 View Code static LinkedList<int> CovertIntToLinkedList(int num){Stack<int> stack new Stack<int>();LinkedList<int> result new LinkedList<int>();while (num!0…

《MySQL 8.0.22執行器源碼分析(4.1)Item_sum類以及聚合》

Item_sum類用于SQL聚合函數的特殊表達式基類。 這些表達式是在聚合函數&#xff08;sum、max&#xff09;等幫助下形成的。item_sum類也是window函數的基類。 聚合函數&#xff08;Aggregate Function&#xff09;實現的大部分代碼在item_sum.h和item_sum.cc 聚合函數限制 不…

Java 性能優化實戰記錄(2)---句柄泄漏和監控

前言: Java不存在內存泄漏, 但存在過期引用以及資源泄漏. (個人看法, 請大牛指正) 這邊對文件句柄泄漏的場景進行下模擬, 并對此做下簡單的分析.如下代碼為模擬一個服務進程, 忽略了句柄關閉, 造成不能繼續正常服務的小場景. 1 public class FileHandleLeakExample {2 3 p…

什么是Java文件?

Java文件 (Java files) The file is a class of java.io package. 該文件是java.io包的類。 If we create a file then we need to remember one thing before creating a file. First, we need to check whether a file exists of the same name or not. If a file of the sa…

繞過本地驗證提交HTML數據

我們在入侵一個網站,比如上傳或者自己定義提交的文件時,會在本地的代碼中遇到阻礙,,也就是過 濾,過濾有兩種,一種是在遠程服務器的腳本上進行的過濾,這段代碼是在服務器上運行后產生作用的,這種過 濾方式叫做遠程過濾;另一種是在我們的IE瀏覽器里執行的腳本過濾,就是說是在我們…

《dp補卡——343. 整數拆分、96. 不同的二叉搜索樹》

343. 整數拆分 1、確定dp數組以及下標含義。 dp[i]&#xff1a;分拆數字i&#xff0c;可以得到的最大的乘積 2、確定遞推公式&#xff1a; dp[i]最大乘積出處&#xff1a;從1遍歷j到i&#xff0c;j * dp[i-j] 與 j * (i-j)取最大值。( 拆分j的情況&#xff0c;在遍歷j的過程…

Adroid學習之 從源碼角度分析-禁止使用回退按鈕方案

有時候&#xff0c;不能讓用戶進行回退操作&#xff0c;如何處理&#xff1f; 查看返回鍵觸發了哪些方法。在打開程序后把這個方法禁止了。問題&#xff1a;程序在后臺駐留&#xff0c;這樣就會出現&#xff0c;其他時候也不能使用回退按鈕。如何處理&#xff0c;在onpase()時方…

騎士游歷問題問題_騎士步行問題

騎士游歷問題問題Problem Statement: 問題陳述&#xff1a; There is a chessboard of size NM and starting position (sx, sy) and destination position (dx,dy). You have to find out how many minimum numbers of moves a knight goes to that destination position? 有…

Android基礎之用Eclipse搭建Android開發環境和創建第一個Android項目(Windows平臺)...

一、搭建Android開發環境 準備工作&#xff1a;下載Eclipse、JDK、Android SDK、ADT插件 下載地址&#xff1a;Eclipse:http://www.eclipse.org/downloads/ JDK&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html Android SD…

《dp補卡——01背包問題》

目錄01背包[416. 分割等和子集](https://leetcode-cn.com/problems/partition-equal-subset-sum/)[1049. 最后一塊石頭的重量 II](https://leetcode-cn.com/problems/last-stone-weight-ii/)[494. 目標和](https://leetcode-cn.com/problems/target-sum/)01背包 1、dp數組以及…

用JavaScript往DIV動態添加內容

參考&#xff1a;http://zhidao.baidu.com/link?url6jSchyqPiEYCBoKdOmv52YHz9r7MTBms2pK1N6ptOX1kaR2eg320mlW1Sr6n36hpOeOadBxC2rWWGuhZPbms-K <div id"show"></div>要填充的數據為: 這是一個測試例子.jquery&#xff1a;$(function(){ var data …

《dp補卡——完全背包問題》

N件物品和一個最多能背重量為W的背包。第i件物品的重量為weight[i]&#xff0c;得到的價值是value[i]。每件物品都有無限個(可以放入背包多次)&#xff0c;求解將哪些物品裝入背包里物品價值總和最大。 01背包和完全背包唯一不同在于遍歷順序上。 01背包的核心代碼&#xff1a…