ToB企服应用市场:ToB评测及商务社交产业平台

标题: 从join的实现窥探MySQL迭代器 [打印本页]

作者: 写过一篇    时间: 2022-9-17 08:38
标题: 从join的实现窥探MySQL迭代器
以如下left join查询语句为范例:
  1. select * from t1 left join t2 on t1.c=t2.a ;
复制代码
以下初始化数据:
  1. 1  DROP TABLE IF EXISTS `t1`;
  2. 2    CREATE TABLE `t1` (
  3. 3      `a` int DEFAULT NULL,
  4. 4      `b` varchar(20) DEFAULT NULL
  5. 5    )
  6. 6    INSERT INTO `t1` VALUES (1, 'a');
  7. 7    INSERT INTO `t1` VALUES (1, 'b');
  8. 8    INSERT INTO `t1` VALUES (4, 'a');
  9. 9    INSERT INTO `t1` VALUES (5, 'a');
  10. 10   
  11. 11    DROP TABLE IF EXISTS `t2`;
  12. 12    CREATE TABLE `t2` (
  13. 13      `c` int DEFAULT NULL,
  14. 14      `d` varchar(20) DEFAULT NULL
  15. 15    )
  16. 16    INSERT INTO `t2` VALUES (9, 'i');
  17. 17    INSERT INTO `t2` VALUES (1, 'i');
  18. 18    INSERT INTO `t2` VALUES (2, 'i');
  19. 19    INSERT INTO `t2` VALUES (3, 'i');
复制代码
1.处理join的yacc入口

在sys_yacc.yy文件内解析t1 left join t2 on t1.c=t2.a;对应处理位置
  1. 1  table_reference outer_join_type table_reference ON_SYM expr
  2. 2    {
  3. 3  $$= NEW_PTN PT_joined_table_on($1, @2, $2, $3, $5);
  4. 4    }
复制代码
其中outer_join_type对应
  1. 1  outer_join_type:
  2. 2    LEFT opt_outer JOIN_SYM          { $$= JTT_LEFT; }
  3. 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内定义的tr1tr2
函数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内首先会对当前的执行优化操作,
至此查询块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)
7.至此客户端收到相应显示查询结果。


Enjoy GreatSQL
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4