《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.mzph.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…