从join的实现窥探MySQL迭代器

深入解析MySQL SQL执行全链路:从语法解析到查询优化的完整流程 作为一名后端开发者,每天敲下无数条 SQL 语句,从简单的 SELECT * FROM users 到复杂的多表关联查询。我们习惯了在客户端工具里输入 SQL,点击执行,然后等待结果。但你是否曾停下来想过,从你敲下回车键到屏幕上显示出数据,这短短几百毫秒甚至几毫秒的时间里,MySQL 内部究竟发生了什么? 很多人对 MySQL 的理解停留在“增删改查”的层面,认为它只是一个存储数据的黑盒。面试时被问到“一条 SQL 是如何执行的”,也只会机械地背诵“连接器、分析器、优化器、执行器”这几个名词。但真正理解这条 阅读详情

以如下left join查询语句为范例:

select * from t1 left join t2 on t1.c=t2.a ;

以下初始化数据:

1  DROP TABLE IF EXISTS `t1`;
2    CREATE TABLE `t1` (
3      `a` int DEFAULT NULL,
4      `b` varchar(20) DEFAULT NULL
5    )
6    INSERT INTO `t1` VALUES (1, 'a');
7    INSERT INTO `t1` VALUES (1, 'b');
8    INSERT INTO `t1` VALUES (4, 'a');
9    INSERT INTO `t1` VALUES (5, 'a');
10    
11    DROP TABLE IF EXISTS `t2`;
12    CREATE TABLE `t2` (
13      `c` int DEFAULT NULL,
14      `d` varchar(20) DEFAULT NULL
15    )
16    INSERT INTO `t2` VALUES (9, 'i');
17    INSERT INTO `t2` VALUES (1, 'i');
18    INSERT INTO `t2` VALUES (2, 'i');
19    INSERT INTO `t2` VALUES (3, 'i');

1.处理join的yacc入口

在sys_yacc.yy文件内解析t1 left join t2 on t1.c=t2.a;对应处理位置

1  table_reference outer_join_type table_reference ON_SYM expr
2    {
3  $$= NEW_PTN PT_joined_table_on($1, @2, $2, $3, $5);
4    }

其中outer_join_type对应

1  outer_join_type:
2    LEFT opt_outer JOIN_SYM          { $$= JTT_LEFT; }
3  | RIGHT opt_outer JOIN_SYM         { $$= JTT_RIGHT; }

入参处理在函数T_joined_table_on内

2.移步到函数PT_joined_table_on

从PT_joined_table_on声明可知其继承PT_joined_table函数,入参左右表赋值为PT_joined_table内定义的tr1和tr2

函数PT_joined_table_on将输入join的左右表加入context内,并调用add_join_on将on内的条件加入右表,记录后续数据过滤条件。

3.执行阶段函数do_command(thd)

具体对应执行函数int mysql_execute_command(THD *thd, bool first_level),语句解析以及相应参数保存完成后,进入函数int mysql_execute_command(THD *thd, bool first_level),此函数内根据前面解析到的命令类型switch (lex->sql_command)调用对应的处理函数,如当前语句为例查询命令解析为lex->sql_command = SQLCOM_SELECT则进入函数lex->m_sql_cmd->execute(thd);其对应为sql_select.cc内函数bool Sql_cmd_dml::execute(THD *thd)。

4.优化器操作,生成access_paths

sql_select.cc内函数bool Sql_cmd_dml::execute(THD *thd)函数内主要操作为函数execute_inner,在函数execute_inner内首先会对当前的执行优化操作,

  1. 调用查询表达式Query_expression的优化器unit->optimize,此函数中会对该Query_expression的内的每个查询块query_block分别先进行优化操作,
  2. 查询块内函数bool JOIN::optimize()内会将每个查询块优化生成查询执行计划 ,具体执行函数为函数JOIN::create_access_paths()内create_root_access_path_for_join()函数,以当前查询为例在函数create_root_access_path_for_join内根据参数条件主要调用ConnectJoins函数
  3. 在函数ConnectJoins内调用FindSubstructure判断是join类型内连接、外连接、半链接等类型
  4. 根据FindSubstructure返回join类型调用相应的函数生成path,当前查询为例执行调用CreateHashJoinAccessPath生成path。

至此查询块query_block的优化操作和path生成完成,查询块优化操作完成后再执行整体表达式Query_expression的优化和path的生成,因为目前范例仅为一个查询块,所以当前无需再做整体表达式的优化和path生成。

5.创建迭代器iterator

根据上一步生成的path调用CreateIteratorFromAccessPath函数生成迭代器,用于循环操作各表数据。

在此函数内会根据path的类型调用生成不同类型的迭代器,以目前范例为例,会调用迭代器类型为HashJoinIterator

6.上述4、5步执行完成后,执行迭代器iterator

在函数execute_inner内执行完成上述4、5步骤操作后主要继续执行unit->execute(thd)函数,其对应执行查询表达式函数bool Query_expression::ExecuteIteratorQuery(THD *thd)

  1. 函数Query_expression::ExecuteIteratorQuery内主要执行m_root_iterator->Init(),迭代器iterator初始化,当前范例为使用HashJoinIterator类型迭代器,因此对应执行迭代器函数HashJoinIterator::Init()
  2. 执行m_build_input->Init()来初始右表table句柄,用于下面函数BuildHashTable()内读取右表数据以便初始化返回数据存储表hashtable,值得注意的是BuildHashTable函数内会根据处理流程调用SetReadingProbeRowState设置执行状态用于引导后续迭代器iterator执行流程。
  3. 函数内最后调用InitProbeIterator执行m_probe_input->Init()初始左表table句柄用于下面函数读取左表数据。
  4. 上面操作完成后执行m_root_iterator->Read()函数,以当前查询为范例其对应int HashJoinIterator::Read()函数,执行过程中根据前面SetReadingProbeRowState设置的流程状态再选择对应的操作函数,以当前范例则会循环读取左表数据,而在操作函数内也会调用SetReadingProbeRowState来设置迭代器iterator下一步操作,直至迭代器处理完成,其中在函数Query_expression::ExecuteIteratorQuery,每次读取一条成功后就会调用send_data操作将结果发送至客户端,直至所有查询结果发送完成。

7.至此客户端收到相应显示查询结果。


Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

欢迎来GreatSQL社区发帖提问 https://greatsql.cn/

GreatSQL社区

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群。

图片

金融时序交叉验证:CPCV组合净化法实战指南 时序交叉验证是金融机器学习中保障模型泛化能力的基础技术,其核心在于尊重数据的时间依赖性与防止未来信息泄露。传统K折CV因随机打乱破坏序列结构,TimeSeriesSplit又缺乏净化机制,均易导致回测过拟合。Combinatorial Purged Cross-Validation(CPCV)通过组合式切分、embargo净化和前向滚动约束,构建高保真验证场景,显著提升策略实盘稳定性。该方法广泛应用于量化因子评估、算法交易回测及高频/中频策略开发,尤其适配带滞后特征、事件驱动或需多周期鲁棒性验证的金融建模任 阅读详情

相关推荐

MyBatis实现动态SQL

MyBatis实现动态SQL ​ MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的 经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在 columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。 ​ 尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中 使用强大的...

weixin_42903912的博客 713

周五轻松修复老项目Bug,加入迭代器和SQL联合查询优化,提升代码质量!

通过合并查询,减少了代码冗余,提高了代码的可维护性。学到了在使用UNION ALL时处理排序的技巧,通过在子查询内部添加ORDER BY并封装为命名的子查询解决了问题。

m0_46464597的博客 470

保姆级教程:用微信小程序+OneNet MQTT API,5分钟搞定温湿度数据实时展示

本文提供了一份详细的教程,教你如何利用微信小程序和OneNet MQTT API在5分钟内实现温湿度数据的实时展示。从OneNet平台配置到小程序数据绑定,手把手指导零基础开发者快速搭建监控系统,涵盖API调用、数据解析和界面设计等关键步骤。

weixin_30298497的博客 368

《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_obje

hanhan的博客 976

Win11移动热点连接故障排查:从IP配置失败到网络共享的全面解决指南

本文提供了Win11移动热点连接故障的全面排查指南,重点解决手机连接时卡在“获取IP地址”或提示“IP配置失败”的问题。文章从基础检查(如确认网络连接、选择正确共享源)入手,深入讲解了核心的网络适配器共享设置、关键系统服务检查、防火墙配置以及终极解决方案——网络重置。通过系统性的步骤,帮助用户彻底修复Win11移动热点无法共享网络的问题。

alice7model的博客 784

LabVIEW小白福音:手把手教你用NI采集卡搭建振动信号采集系统(附源码和避坑指南)

本文为LabVIEW初学者提供详细的NI采集卡振动信号采集系统搭建指南,涵盖硬件连接、驱动安装、信号处理及性能优化等关键步骤。特别针对振动信号采集系统中的常见问题提供解决方案,并附源码和避坑指南,帮助用户快速上手并避免常见错误。

weixin_30485379的博客 102

mysql迭代器_迭代器 - 刘海子 - 博客园

一,三层装饰器import timedef outter1(func):def wrapper(*args, **kwargs):start = time.time()res = func(*args, **kwargs)stop = time.time()print(stop - start)return res​ return wrapper@函数的内存地址1(1,2,3,4,5) #...

weixin_39669075的博客 266

FMEA-MSR步骤三:功能分析

目的 FMEA-MSR功能分析的主要目标: ● 功能及各功能之间的关系的可视化 ● 功能树/网络或等效功能矩阵参数图(P图) ● 顾客(外部和内部)功能与相关要求的关联 ● 要求或特性与功能的关联 ● 工程团队(系统、安全和组件)之间的协作 ● 失效分析步骤的基础 (点击链接进入官网领取软件试用) 在监视及系统响应的补充FMEA中,对失效探测和失效响应的监视视为其具有的功能。硬件和软件功能可能包括监视控制状态的功能。 故障/失效的监视和探测功能可能包括超出范围的探测、循环冗余校验、真实性检查和序列计数器检查

Infomass的博客 2389

mysql迭代器_迭代器 - 御姐玫瑰 - 博客园

一、协程1、协程是Python语言独有的一种多任务方式。2、使用gevent模块实现协程。3、协程的实现过程(步骤)迭代器生成器yieldgreenletgevent二、迭代器1、迭代的定义:在原有的基础之上添加新的功能。2、迭代对象的定义:即一个对象中有包含了【__iter__】的方法。3、迭代器的定义:即:一个对象中既包含了【__iter__】方法,又包含了【__next__】方法通过它可以...

weixin_33219863的博客 393

使用 Fargate 在 AWS ECS 上运行 Spring Boot 应用程序

本文介绍了使用AWS Fargate支持的ECS部署SpringBoot应用的完整流程。主要内容包括:1)将SpringBoot应用打包为Docker镜像并推送至ECR;2)创建任务定义配置CPU、内存和网络等参数;3)设置ECS服务管理任务运行;4)配置负载均衡器分配流量;5)设计VPC网络和安全组规则确保安全访问;6)使用SSM参数存储管理敏感信息。整个过程实现了无服务器化部署,既保持了应用控制权,又免除了基础设施管理负担,是扩展Web服务的可靠方案。

介绍AWS Azure GCP devops Terraform 等技术 511

电子图像增稳(EIS)原理详解——从抖动补偿到代码实现

电子图像增稳(EIS)是一种通过软件算法实现视频稳定的技术,广泛应用于GoPro、手机和无人机等设备。与光学防抖(OIS)和机械云台不同,EIS通过图像裁切和运动补偿来消除抖动,具有成本低、补偿范围大的优点,但会损失10-30%的画幅。其核心流程包括运动检测、抖动分离、运动补偿和图像裁切四个步骤。相比硬件方案,纯软件实现的EIS更适合消费级电子产品,已成为移动设备视频拍摄的重要技术。

电脑管家 409

【数据库篇】MySQL源码整体分析

源码下载地址:https://github.com/mysql/mysql-server 分析的是当前最新源码8.0.22的样子,这段时间才开始接触mysql源码,主要分析mysql的查询,后期在逐步分析插入和锁等内容。 分析mysql具体功能前,先介绍下mysql整体运行流程,然后后面再具体分析功能模块。 一、先介绍mysql入口及网络请求 1.1、mysql的入口 //main.cc int main(int argc, char **argv) { return mysqld_main(arg

zxz1580977728的博客 4680

【WRFDA教程第一期】运行观测预处理程序(OBSPROC)

运行观测预处理程序(OBSPROC)

WW、forever的博客 1891

MySQL SQL执行全链路解析:从Parser到Executor的完整生命周期

在数据库系统中,SQL语句的执行是一个从客户端请求到结果返回的复杂过程,其核心在于查询优化与执行引擎的高效协作。理解SQL执行原理,特别是解析器、优化器和执行器三大核心组件的工作机制,是进行数据库性能调优和问题诊断的基础。解析器负责将SQL文本转换为结构化的抽象语法树,优化器则基于统计信息和成本模型生成最优执行计划,而执行器通过调用存储引擎接口完成数据的实际存取。这一流程直接关系到索引设计、查询性能及系统资源利用效率。通过掌握执行计划分析工具如EXPLAIN,开发者可以精准定位慢查询瓶颈,优化索引策略,从而

weixin_33911824的博客 386

基于龙虾Claw的会议纪要自动提取与重点内容总结办公场景实践

本文介绍如何使用龙虾Claw构建会议纪要自动提取与重点内容总结系统,实现会议内容的智能处理。

一键难忘的博客 251

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

处理百万级CSV文件:从内存优化到高效导入的实战指南

在数据处理领域,CSV作为通用交换格式,常面临海量数据处理的挑战。其核心原理在于文本存储与分隔符解析,但传统逐行读取方式在处理百万行以上文件时易引发内存溢出。从技术价值看,高效处理大规模CSV能显著提升数据流转效率,降低计算资源消耗。实际应用场景涵盖日志分析、数据迁移、ETL流程等,尤其适合金融交易记录、用户行为日志等结构化数据。本文聚焦内存优化策略与分块处理技术,通过pandas的chunksize参数实现流式读取,结合数据库原生导入工具如PostgreSQL的COPY命令,构建完整处理流水线。针对四百万

weixin_30378623的博客 345

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySQL报障之coredump收集处理流程

*GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。1.配置coredump1.1core-file1.2coredumper2.现场初步分析2.1分析error log2.2调试core文件3.信息搜集4.参考文档1.配置coredumpcore文件是在程序出现异常退出时,保留的异常堆栈文件,能够帮助开发人员快速定位问题,故对于线上的程序,需要开启coredump功能...

老叶茶馆 1347

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

sql迭代(with)查询上下级等,以及sqlserver的行列转换

emp表 1 为了便于分析,先拿一个员工 select * from emp a where a.empno in ('7369') 2 用with迭代出7369的所有上级(迭代里面不能用外部关联) with tt as ( select a.empno ,a.ENAME,a.mgr,b.ENAME as mgr_ENAME,count(a.ename)over(partition by a.empno) as rn from emp a left join em...

weixin_49539546的博客 4425

mysql迭代器_Iterator 迭代器(一)

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。以上引用百度的内容迭代器的创建和使用:利用iterator接口创建迭代器,位于java.util包下。有三...

weixin_42510600的博客 979

Mysql 迭代器

今天在在做题时,发现mysql竟然提供可迭代函数 while,repeat,loop。 这些函数使用的前提是自己定义一个procedure,然后调用这个procedure。 https://blog.youkuaiyun.com/yangzjchn/article/details/82705565 ...

weixin_42578783的博客 874

迭代器Iterator用法

HsahSet set=new HashSet();

m1234ilu的博客 760

迭代器Iterator基本用法--集合遍历

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I...

CROSSFIT的博客 6472

迭代器和iter()函数

1、先来个例子,有个初步的印象:myTuple=(123,'xyz',45.67) i=iter(myTuple) i.next() 123 i.next() 'xyz' i.next() 45.67 i.next() Traceback (most recent call last): File "", line 1, in? StopIteration上面的代码中通过iter()函数显式的使用了

火烧尾的专栏 3066

mysql迭代器_迭代器是什么,C++ STL迭代器(iterator)用法详解

无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用“迭代器(iterator)”来实现。那么,迭代器到底是什么呢?我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求和等需要对数据进行遍历的操作方法应该是类似的。既然类似,完全可以利用泛型技术,将它们设计成适...

weixin_35750747的博客 341
上一篇: 如何干涉MySQL优化器使用hash join
下一篇: 活动 | 开源项目成熟度评测+入选开源社区成员 GreatSQL社区闪耀OSCAR 2022开源产业大会
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值