当前位置: 首页 > news >正文

MySQL解析器源码分析--对select语句中子查询处理逻辑的分析(一)

背景

一个最简单的select语句包含select子句、from子句、where子句等,这些子句都不包含子查询(subselect),也没有union操作。而复杂的select语句包含select子句、from子句、where子句(这些子查询可以y是最简单的select语句也可以y是复杂的select语句),同时select语句中可能包含union,即将数个select子句联合在一起
MySQL解析器(lex+yacc)是如何解析上述复杂的SQL的呢?又是使用什么样的数据结构来完整的维护一个大的select中包含的subselect、union的d关系呢?本文希望通过介绍MySQL解析器中相关的数据结构及处理过程,解答上述两个问题。

  


主要数据结构及其之间关系

MySQL解析器中负责分析和存储一个select语句信息的数据结构是st_select_lex类(MySQL中同时将该类宏定义为SELECT_LEX),同时负责分析和存储union关系的数据结构是st_select_lex_unit(MySQL中同时将该类宏定义为SELECT_LEX_UNIT),而这两个类都继承于st_select_lex_node类。

对于SELECT_LEX类,它主要是存储一个select语句中select子句的返回列信息,from子句中的表信息,order by,group by子句的列信息等。对于本文所关心的问题,SELECT_LEX类使用继承于st_select_lex_node类的next指针存储和该select语句进行union操作的其他select语句对应的SELECT_LEX的地址,通过这个指针串成union链表。

 

例如:SQL1:select * from test1 where id=5 union select * from test1 where id=6;

 


对于SELECT_LEX_UNIT负责管理处于同一级的进行union操作的数个select子句对应的SELECT_LEX。SELECT_LEX_UNIT通过继承于st_select_lex_node类的slave指针存储属于这一级的进行union操作的第一个SELECT_LEX,而这一级别其他参与union操作的SELECT_LEX,可以通过next指针串成的链表依次找到。同时SELECT_LEX_UNIT类中还有一个成员变量fake_select_lex,它来保存整个union操作的order by,limit条件。

例如:

 


对于select子句,from子句,where子句中出现子查询(subselect)的情况,MySQL解析器会先建一个SELECT_LEX_UNIT,将此SELECT_LEX_UNIT挂在该子查询上一级select对应的SELECT_LEX下(即该SELECT_LEX的slave指针赋值为此SELECT_LEX_UNIT对应的地址),同时新建一个SELECT_LEX和这个子查询对应,将这个新建的SELECT_LEX挂在刚建的SELECT_LEX_UNIT下。


(未完待续)

 

【本文首发于: 百度运维空间http://hi.baidu.com/ops_bd/blog/item/28f61b1c82902fceac6e750b.html
关注百度技术沙龙















本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/748845,如需转载请自行联系原作者

相关文章:

  • 使用.net 2.0开发多层架构的系统之一——本网站2006-10-01版本源代码公布
  • Day18 Django的深入使用
  • 谁还原了你的数据库?
  • 根据MAC地址查询IP地址
  • 安装配置samba服务器和客户端
  • 数据结构—队列
  • 多核编程的四层境界
  • 理论与现实的距离
  • 省钱之道--图解域域树域林根域的含义
  • 各种数字类型转换成字符串型
  • 分布式事务-二阶段提交与三阶段提交
  • HDU 4709 Herding 几何题解
  • jqGrid获取json数据方法
  • JAVA类的初始化顺序与initialize参数
  • 5.[研磨设计模式笔记]装饰模式
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • exif信息对照
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript DOM 10 - 滚动
  • JavaScript异步流程控制的前世今生
  • mysql 数据库四种事务隔离级别
  • Python3爬取英雄联盟英雄皮肤大图
  • Redis中的lru算法实现
  • 缓存与缓冲
  • 如何学习JavaEE,项目又该如何做?
  • 深入浅出Node.js
  • 一道面试题引发的“血案”
  • FaaS 的简单实践
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​Java并发新构件之Exchanger
  • #14vue3生成表单并跳转到外部地址的方式
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (2)MFC+openGL单文档框架glFrame
  • (3)(3.5) 遥测无线电区域条例
  • (day6) 319. 灯泡开关
  • (Java)【深基9.例1】选举学生会
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Neo4j下载安装以及初次使用
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net mvc总结
  • .net Stream篇(六)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • @Builder用法
  • @hook扩展分析
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [BUUCTF 2018]Online Tool