目录

  • 一条语句的函数调用栈顺序
  • 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一些记录》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. Clinicast让癌症治疗不那么昂贵
  2. cocos2d-x游戏实例(17)-纵版射击游戏(4)
  3. 编程之美-2.17-数组循环移位
  4. dw怎么打开html模板,Dreamweaver中如何使用模板
  5. c++ 舞伴配对问题_挑战新物体描述问题,视觉词表解决方案超越人类表现
  6. Acoustic Echo Cancellation (AEC) 回音消除技术探索
  7. .NET中变量生存期
  8. hash ruby 定义 嵌套_Ruby:合并嵌套哈希
  9. python中str类型_python的str是什么类型
  10. Java经典设计模式(2):七大结构型模式(附实例和详解)
  11. 连锁门店使用新零售连锁管理系统的价值在哪?
  12. 高频消息中间件面试题解析
  13. win7 加密oracle修正,win7 远程连接服务器出现身份验证错误,又找不到加密Oracle修正...
  14. sci国外期刊投稿过程(已完结)
  15. 焦虑症应该怎么办?这六个缓解方法建议试试
  16. 中国超级计算机神威 上市公司,中国拟研发百亿亿级超级计算机 秒杀目前最快神威...
  17. Centos8怎么进行复位清屏? Centos8终端复位清屏的技巧
  18. Java集合面试题汇总【附答案】持续更新
  19. Mybatis使用及原理
  20. 钱多多第二阶段冲刺07

热门文章

  1. 计算机专业常用图论,同等学力申硕计算机专业--数学公式集合(新增学习笔记)...
  2. bootstrap-table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)
  3. js基本包装类型和引用类型
  4. FancyBox - 经典的 jQuery Lightbox 插件
  5. ie下按keydown事件会触发button
  6. vue todolist
  7. idiom的学习笔记(一)、三栏布局
  8. IDEA中使用Maven
  9. ADO.NET 事务控制
  10. input select 值得绑定与获取