《MySQL 8.0.22执行器源码分析(1)——execute iterator一些记录》

目录

    • 一条语句的函数调用栈顺序
    • 8.0使用迭代器模式改进executor
      • int *handler*::ha_rnd_next(*uchar* **buf*)
      • int *TableScanIterator*::Read()
      • int FilterIterator :: Read()
      • int HashJoinIterator::Read()
      • int NestedLoopIterator :: Read()
      • int StreamingIterator::Read ()
      • *ha_rows* read_all_rows
    • 回顾迭代器模式

一条语句的函数调用栈顺序

记录了函数语句从服务器main函数到执行器之前的一些具体调用,5.几版本到8.0.22版本,这里的调用顺序并没有多大变化
在这里插入图片描述
注意这里是接着上面的2、在这里插入图片描述
处理完之后,开始返回,返回到之前的case
在这里插入图片描述
按照网上代码版本接下来的调用顺序应该是这样的:这里的JOIN::exec()do_select我没有在8.0代码中找到,就直接跳过这两个函数吧。

在这里插入图片描述

8.0使用迭代器模式改进executor

在文章https://cloud.tencent.com/developer/article/1461353中说道:
MySQL8.0对执行器进行了改进,创建一个新的用于迭代访问记录的API,它足够通用,可以替换MySQL中所有原有的记录迭代器,并逐步替代掉原有的执行器。
这是之前的执行器接口:
在这里插入图片描述
这是现在的:
在这里插入图片描述
该文章列出了一些迭代器类型:

TableScanIterator:顺序扫描,调用存储引擎接口ha_rnd_next获取一行记录。
IndexScanIterator:全量索引扫描,根据扫描顺序,分别调用ha_index_next或者ha_index_prev来获取一行记录。
IndexRangeScanIterator:范围索引扫描,包装了下QUICK_SELECT_I,调用QUICK_SELECT_I::get_next来获取一行记录。
SortingIterator:对另一个迭代器输出进行排序。
SortBufferIterator:从缓冲区读取已经排好序的结果集,(主要给SortingIterator调用)
SortBufferIndirectIterator:从缓冲区读取行ID然后从表中读取对应的行(由SortingIterator和某些形式的unique操作使用)
SortFileIterator:从文件中读取已经排好序的结果集(主要给SortingIterator调用)
SortFileIndirectIterator:从文件读取行ID然后从表中读取对应的行(由SortingIterator和某些形式的unique操作使用)
RefIterator:从连接右表中读取指定key的行。
RefOrNullIterator:从连接右表中读取指定key或者为NULL的行。
EQRefIterator:使用唯一key来从连接的右表中读取行。
ConstIterator:从一个只可能匹配出一行的表(Const Table)中读取一行数据。
FullTextSearchIterator:使用全文检索索引读取一行数据。
DynamicRangeIterator:为每一行调用范围优化器,然后根据需要包装QUICK_SELECT_I或表扫描。
PushedJoinRefIterator:读取已下推到NDB的连接的输出。
FilterIterator: 读取一系列行,输出符合条件的行,用来实现WHERE/HAVING。
LimitOffsetIterator: 从offset开始读取行,直到满足limit限制,用来实现LIMIT/OFFSET。
AggregateIterator: 实现聚集函数并且如果需要的话进行分组操作。
NestedLoopiterator: 使用嵌套循环算法连接两个迭代器(内连接,外连接或反连接)。
MaterializeIterator: 从另一个迭代器读取结果,并放入临时表,然后读取临时表记录。
FakeSingleRowIterator: 返回单行,然后结束。 仅在某些使用const表情况下才使用(例如只有const表,仍然需要一个迭代器来读取该单行)

下面是我对mysql语句
use table;debug时发现的迭代器调用顺序:
不知道解读是否正确。
在这里插入图片描述
之后就是将结果排序:
在这里插入图片描述

int handler::ha_rnd_next(uchar *buf)

https://dev.mysql.com/doc/dev/mysql-server/latest/classhandler.html#ad3743f3a48e7be751dbb2691be4c992a
在这里插入图片描述

int TableScanIterator::Read()

https://dev.mysql.com/doc/dev/mysql-server/latest/classFilterIterator.html
在这里插入图片描述

int FilterIterator :: Read()

一个迭代器,它接收一行流,并且仅通过那些满足某些条件(即条件的结果为true)的行。

https://dev.mysql.com/doc/dev/mysql-server/latest/classFilterIterator.html#a166014f053203bb025d12e95180d8ffa
在这里插入图片描述

int HashJoinIterator::Read()

https://dev.mysql.com/doc/dev/mysql-server/latest/classHashJoinIterator.html#a64f8107d4a8b3bb1ab7804e9e1c2689c

在这里插入图片描述

int NestedLoopIterator :: Read()

一个简单的嵌套循环连接,接受两个迭代器(左/外和右/内)并将他们连接到一起。这可能会多次扫描内部迭代器。迭代器用作状态机,其中状态记录我们是否需要读取新的外部行,以及是否从内部迭代器中看到任何行(如果没有,则外部联接需要合成新的行)

https://dev.mysql.com/doc/dev/mysql-server/latest/classNestedLoopIterator.html
在这里插入图片描述

int StreamingIterator::Read ()

https://dev.mysql.com/doc/dev/mysql-server/latest/classStreamingIterator.html#details

StreamingIterator的每个Read()只会将调用转给子查询迭代器,并执行从一组字段到另一组的所需复制。它用于优化程序设置的实现的时间。

It is used for when the optimizer would normally set up a materialization, but you don't actually need one, ie. you don't want to read the rows multiple times after writing them, and you don't want to access them by index (only a single table scan). It also takes care of setting the NULL row flag on the temporary table.

这段英文没读懂。。。
在这里插入图片描述

ha_rows read_all_rows

读取所有行,并将它们写入一个临时文件(如果我们在排序缓冲区中空间不足)。

保证所有产生的序列都是非空的。返回的是成功记录的记录数

https://dev.mysql.com/doc/dev/mysql-server/latest/filesort_8cc.html#acfc65b7a8828ea94df20c3944d1947fd
在这里插入图片描述

回顾迭代器模式

迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。

当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。

(针对不同对象)

当我们对聚集有多种方式遍历时,可以考虑用迭代器模式。(针对不同遍历方式,如从前往后、从后往前)

为遍历不同的聚集结构提供统一接口。

关于MySQL8.0版本的迭代器的作用在后面的笔记继续介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于autoupgader的狗屎问题

由于win7和xp的权限问题,导致这个自动升级玩意不正常。这个狗屎问题很简单,把exe文件的兼容性设定该一下。真是气死洒家了。转载于:https://www.cnblogs.com/usegear/p/3679097.html

strcspn函数

函数原型&#xff1a;extern int strcspn(char *str1,char *str2) 参数说明&#xff1a;str1为参照字符串&#xff0c;即str2中每个字符分别与str1中的每个字符比较。 所在库名&#xff1a;#include <string.h> 函数功能&#xff1a;以str1为参照&#xff0c…

c语言 sqlite_SQLite与C语言

c语言 sqliteSQLite数据库简介 (Introduction to SQLite database) SQLite is a relational database; it is used for embedded devices. Now a day it is using worldwide for different embedded devices. SQLite是一个关系数据库。 它用于嵌入式设备。 如今&#xff0c;它已…

《MySQL 8.0.22执行器源码分析(2)解读函数 ExecuteIteratorQuery》

函数代码 bool SELECT_LEX_UNIT::ExecuteIteratorQuery(THD *thd) {THD_STAGE_INFO(thd, stage_executing);DEBUG_SYNC(thd, "before_join_exec");Opt_trace_context *const trace &thd->opt_trace;Opt_trace_object trace_wrapper(trace);Opt_trace_object…

C语言,如何产生随机数

1. 基本函数 在C语言中取随机数所需要的函数是: int rand(void);void srand (unsigned int n); rand()函数和srand()函数被声明在头文件stdlib.h中,所以要使用这两个函数必须包含该头文件: #include <stdlib.h> 2. 使用方法 rand()函数返回0到RAND_MAX之间的伪随机数(pse…

MongoDB源码概述——内存管理和存储引擎

数据存储&#xff1a; 之前在介绍Journal的时候有说到为什么MongoDB会先把数据放入内存&#xff0c;而不是直接持久化到数据库存储文件&#xff0c;这与MongoDB对数据库记录文件的存储管理操作有关。MongoDB采用操作系统底层提供的内存文件映射&#xff08;MMap&#xff09;的方…

OBTW的完整形式是什么?

OBTW&#xff1a;哦&#xff0c;顺便说一下 (OBTW: Oh, By The Way) OBTW is an abbreviation of "Oh, By The Way". OBTW是“哦&#xff0c;顺便说一下”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media network…

SharePoint 2010 Form Authentication (SQL) based on existing database

博客地址 http://blog.csdn.net/foxdaveSharePoint 2010 表单认证&#xff0c;基于现有数据库的用户信息表本文主要描述本人配置过程中涉及到的步骤&#xff0c;仅作为参考&#xff0c;不要仅限于此步骤。另外本文通俗易懂&#xff0c;适合大众口味儿。I. 开启并配置基于声明的…

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

目录RowIteratorInit()Read()SetNullRowFlag()UnlockRow()StartPSIBatchMode()EndPSIBatchModeIfStarted()real_iterator()RowIterator 使用选定的访问方法读取单个表的上下文&#xff1a;索引读取&#xff0c;扫描等&#xff0c;缓存的使用等。 它主要是用作接口&#xff0c;但…

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…