《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版本的迭代器的作用在后面的笔记继续介绍。
《MySQL 8.0.22执行器源码分析(1)——execute iterator一些记录》相关推荐
- ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- 信息学奥赛真题解析(玩具谜题)
玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...
- 信息学奥赛之初赛 第1轮 讲解(01-08课)
信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...
- 信息学奥赛一本通习题答案(五)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通习题答案(三)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通题目代码(非题库)
为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...
- 信息学奥赛一本通(C++版) 刷题 记录
总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...
- 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离
首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...
最新文章
- Clinicast让癌症治疗不那么昂贵
- cocos2d-x游戏实例(17)-纵版射击游戏(4)
- 编程之美-2.17-数组循环移位
- dw怎么打开html模板,Dreamweaver中如何使用模板
- c++ 舞伴配对问题_挑战新物体描述问题,视觉词表解决方案超越人类表现
- Acoustic Echo Cancellation (AEC) 回音消除技术探索
- .NET中变量生存期
- hash ruby 定义 嵌套_Ruby:合并嵌套哈希
- python中str类型_python的str是什么类型
- Java经典设计模式(2):七大结构型模式(附实例和详解)
- 连锁门店使用新零售连锁管理系统的价值在哪?
- 高频消息中间件面试题解析
- win7 加密oracle修正,win7 远程连接服务器出现身份验证错误,又找不到加密Oracle修正...
- sci国外期刊投稿过程(已完结)
- 焦虑症应该怎么办?这六个缓解方法建议试试
- 中国超级计算机神威 上市公司,中国拟研发百亿亿级超级计算机 秒杀目前最快神威...
- Centos8怎么进行复位清屏? Centos8终端复位清屏的技巧
- Java集合面试题汇总【附答案】持续更新
- Mybatis使用及原理
- 钱多多第二阶段冲刺07