您的当前位置:首页 >应用开发 >从Join的实现窥探MySQL迭代器 正文
时间:2025-11-04 16:54:50 来源:网络整理编辑:应用开发
以如下left join查询语句为范例:复制select * from t1 left join t2 on t1.c=t2.a ;1.
以如下left join查询语句为范例:复制select * from t1 left join t2 on 的L迭代器t1.c=t2.a ;1.
以下初始化数据:

在sys_yacc.yy文件内解析t1 left join t2 on t1.c=t2.a;对应处理位置。
复制1table_reference outer_join_type table_reference ON_SYM expr
2 {3 $$= NEW_PTN PT_joined_table_on($1,实现 @2, $2, $3, $5);4}1.2.3.4.其中outer_join_type对应。
复制1 outer_join_type:2 LEFT opt_outer JOIN_SYM { $$= JTT_LEFT; }3 | RIGHT opt_outer JOIN_SYM { $$= JTT_RIGHT; }1.2.3.入参处理在函数T_joined_table_on内。窥探
2.移步到函数PT_joined_table_on从PT_joined_table_on声明可知其继承PT_joined_table函数,的L迭代器入参左右表赋值为PT_joined_table内定义的实现tr1和tr2。
函数PT_joined_table_on将输入join的窥探左右表加入context内,并调用add_join_on将on内的的L迭代器条件加入右表,记录后续数据过滤条件。实现
3.执行阶段函数do_command(thd)具体对应执行函数int mysql_execute_command(THD *thd,窥探 bool first_level),语句解析以及相应参数保存完成后,的L迭代器进入函数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)。的L迭代器
4.优化器操作,实现生成access_pathssql_select.cc内函数bool Sql_cmd_dml::execute(THD *thd)函数内主要操作为函数execute_inner,窥探在函数execute_inner内首先会对当前的执行优化操作。
调用查询表达式Query_expression的服务器托管优化器unit->optimize,此函数中会对该Query_expression的内的每个查询块query_block分别先进行优化操作。
查询块内函数bool JOIN::optimize()内会将每个查询块优化生成查询执行计划 ,具体执行函数为函数JOIN::create_access_paths()内create_root_access_path_for_join()函数,以当前查询为例在函数create_root_access_path_for_join内根据参数条件主要调用ConnectJoins函数。
在函数ConnectJoins内调用FindSubstructure判断是join类型内连接、外连接、半链接等类型。
根据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)。
函数Query_expression::ExecuteIteratorQuery内主要执行m_root_iterator->Init(),迭代器iterator初始化,当前范例为使用HashJoinIterator类型迭代器,因此对应执行迭代器函数HashJoinIterator::Init()。
执行m_build_input->Init()来初始右表table句柄,用于下面函数BuildHashTable()内读取右表数据以便初始化返回数据存储表hashtable,值得注意的是BuildHashTable函数内会根据处理流程调用SetReadingProbeRowState设置执行状态用于引导后续迭代器iterator执行流程。
函数内最后调用InitProbeIterator执行m_probe_input->Init()初始左表table句柄用于下面函数读取左表数据。
上面操作完成后执行m_root_iterator->Read()函数,以当前查询为范例其对应int HashJoinIterator::Read()函数,执行过程中根据前面SetReadingProbeRowState设置的流程状态再选择对应的操作函数,以当前范例则会循环读取左表数据,而在操作函数内也会调用SetReadingProbeRowState来设置迭代器iterator下一步操作,直至迭代器处理完成,其中在函数Query_expression::ExecuteIteratorQuery,每次读取一条成功后就会调用send_data操作将结果发送至客户端,直至所有查询结果发送完成。
7.至此客户端收到相应显示查询结果。IT技术网电脑新手小白攻略教程(全面解析电脑使用技巧,帮助小白迅速掌握电脑操作)2025-11-04 16:52
全面了解工作平板电脑的用法教程(提升工作效率的秘密武器——工作平板电脑)2025-11-04 16:46
滑板飞天记(探索滑板飞升的秘密,点燃你的极限激情!)2025-11-04 16:37
腾达AC62025-11-04 16:07
用粘土手工打造独特电脑装饰(发挥创意,打造个性化电脑装饰品)2025-11-04 16:01
一加3T怎么样?值得买吗?(一加3T的关键特点和用户评价)2025-11-04 15:48
华为麦芒5电信版(领先行业的技术与设计,华为麦芒5电信版值得拥有)2025-11-04 15:20
电脑页面显示错误的原因及恢复方法(解决电脑页面显示错误的有效技巧)2025-11-04 15:07
解决宽带错误651调制解调器问题的有效方法(解决宽带错误651的实用技巧和技术指导)2025-11-04 14:45
香港市场上销售索尼手机的情况(索尼手机在香港的销售表现及市场前景展望)2025-11-04 14:11
如何使用MXKey链接电脑(简单教程助您轻松连接MXKey与电脑)2025-11-04 16:46
探索以凡客4K电视的卓越表现(让画面绽放细节,引领视觉新时代)2025-11-04 16:33
电脑琴谱新手教程简单入门指南(从零基础开始学习电脑琴谱的简单技巧和方法)2025-11-04 16:13
显卡坏的原因及如何避免(探究显卡损坏的常见原因以及保护方法)2025-11-04 16:02
火影电脑系统重置教程(快速恢复系统正常运行,让电脑如新)2025-11-04 15:39
用电脑贴纸将宜家桌子改造一新(打造个性化办公空间,简单又经济的方法)2025-11-04 15:37
探究梦幻手游电脑版脚本错误的原因与解决方法(揭示梦幻手游电脑版脚本错误的影响和调试技巧)2025-11-04 15:14
简明教程(从零开始,轻松重装Windows101909版本系统)2025-11-04 14:59
简单快捷的双系统一键安装教程(轻松享受双系统的便利,一键安装教你如何做到)2025-11-04 14:53
乐视盒子U4如何满足用户的需求2025-11-04 14:28