mysql源码剖析–LEX结构分析

  • 引言
  • 1 select语法树
    • 1.1 核心数据结构
    • 1.2 语法树结构
  • 2 from子句
    • 2.1 解析原理
    • 2.2 语法树结构
  • 3 where语句

引言

mysql通过THD的父类字段Statement::lex保存解析出来的语法树信息。struct LEX继承于Query_tables_list。LEX中涉及的查询语法树的核心成员包括:

  • unit:语法树顶层节点;
  • select_lex:顶层第一个select语句节点;
  • all_selects_list:通过link_next和link_prev构成所有select子句的双向链表;
  • query_tables:通过next_global和prev_global构成所有talbe的双向链表;
  • query_tables_last:指向query_tables中最后一个元素;

注:其他成员不作描述,在sql/sql_lex.h源码文件中。

1 select语法树

1.1 核心数据结构

select语法树由SELECT_LEX_UNIT(即st_select_lex_unit)节点和SELECT_LEX(即st_select_lex)节点组成。两个class都继承自st_select_lex_node。SELECT_LEX的核心成员如下:

  • table_list:通过next_local串联起来的表结构,也就是from后面的表;
  • top_join_list:将from后面的表根据jion语法规则生成的jion树;
  • where:where语句后面的条件表示树;
  • group_list:group分组条件;
  • having:having条件;
  • item_list:select语句后面的字段列表;
  • order_list:order排序方式;
  • select_limit,offset_limit:行限制条件;

1.2 语法树结构

查询语句的语法树结构如下:

整个语法树由SELECT_LEX_UNIT作为顶层,下面挂unit的多个select语句;每个select子句的顶层SELECT_LEX_UNIT挂到所属的select主句上面。THD::lex->unit指向顶层L1;THD::lex->select_lex指向顶层select 1。

2 from子句

2.1 解析原理

整个from表格解析规则如下:
规则1:JOIN表达式:=(JOIN表达式 | JOIN嵌套)JOIN(JOIN表达式 | JOIN嵌套)
规则2:JOIN嵌套:=‘(’ (表引用 | JOIN表达式)(,表引用 | ,JOIN表达式)* ‘)’ | 表引用
也就是说一个jion表达式是由join表达式或join嵌套组成;一个join嵌套可以是一个表引用,或者多个表引用或join表达式通过“,”相隔、且首尾括号包围。

2.2 语法树结构

from后面的表解析成TABLE_LIST结构,所有的TABLE_LIST按如下方式串联:

3 where语句

where语句都是抽象类Item的子类一层一层组成语法树结构。后续再补图。。。

mysql源码剖析–LEX结构分析相关推荐

  1. mysql源码剖析–通信协议分析

    mysql源码剖析–通信协议分析 引言 1 交互过程 1.1 认证阶段 1.2 服务阶段 1.3 退出阶段 2 协议简介 2.1 server->client握手协议 2.2 client-&g ...

  2. mysql启用组提交变量_MySQL的COMMIT_ORDER模式下组提交分组实现与BUG案例源码剖析...

    背景 自MySQL 5.7以来,组提交大面积应用,已经不断地得到优化.但网上有关组提交的实现机制,却还不够详细.故障多的时候,往往会发生一些模棱两可的揣测和猜疑.因此,笔者有了从自己的角度,去分析组提 ...

  3. mysql buffer 命中率_从MySQL的源码剖析Innodb buffer的命中率计算

    按官方手册推荐Innodb buffer Hit Ratios的计算是: 100-((iReads / iReadRequests)*100) iReads : mysql->status-&g ...

  4. 菜鸟nginx源码剖析

    菜鸟nginx源码剖析 配置与部署篇(一) 手把手配置nginx "I love you"  TCMalloc 对MYSQL 性能 优化的分析 菜鸟nginx源码剖析系列文章解读 ...

  5. Python envoy 模块源码剖析

    Kenneth Reitz 是公认的这个世界上 Python 代码写得最好的人之一.抱着学习的心态,我阅读了 Reitz 写的 envoy 模块的源码,将笔记记录如下. 介绍 和 requests 模 ...

  6. MySQL · 源码分析 · MySQL 半同步复制数据一致性分析

    简介 MySQL Replication为MySQL用户提供了高可用性和可扩展性解决方案.本文介绍了MySQL Replication的主要发展历程,然后通过三个参数rpl_semi_sync_mas ...

  7. SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别

    SpringDataJPA+Hibernate框架源码剖析系列文章: SpringDataJPA+Hibernate框架源码剖析(一)框架介绍 SpringDataJPA+Hibernate框架源码剖 ...

  8. 【知其然,知其所以然】配置中心 Apollo源码剖析

    第2章 Apollo源码剖析 能力目标 能够基于Git导入Apollo源码 能够基于IDEA实现DEBUG分析APP创建 掌握Namespace创建过程 掌握Item创建过程 掌握灰度发布创建过程 1 ...

  9. 转 MySQL源码分析

    看到一个不错的介绍,原址如下: http://software.intel.com/zh-cn/blogs/2010/08/20/mysql0/ MySQL源码分析(0):编译安装及调试 作者: Yu ...

最新文章

  1. 漫漫运维路——集群基础知识
  2. Spring 命名空间
  3. Android之SharedPreferences 讲解
  4. hdu 2874(LCA + 节点间距离)
  5. DCGAN in Tensorflow生成动漫人物
  6. react学习(42)----react中的jsx表达对象
  7. 委外订单_ERP软件教程:金蝶ERP的委外加工业务流程(一)
  8. 2019无盘游戏服务器128g内存,云更新无盘客户端 v2019.8.15.12486官方版
  9. [资料]PHP中的__set __get使用
  10. 如何使keystone更有效率
  11. C标准预定义实用的宏
  12. Pygame教程系列四:播放音频篇
  13. java中各种O的含义(PO,VO,TO,QO,BO,DAO,DTO,POJO)
  14. GNU C++ 智能指针6-- 解析_Sp_counted_inplace类
  15. 28岁自学Python转行靠谱吗?入行晚吗?
  16. 数据结构与算法学习笔记——链栈
  17. android gif编辑,GIF编辑
  18. 各大搜索引擎收录地址
  19. PHP实现以数组var_dump,array_combine等函数的方法功能举例
  20. 工程监测多通道振弦模拟信号采集仪VTN参数修改

热门文章

  1. pcl 中的滤波与降采样
  2. 【站在微笑的肩上】Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
  3. storm drpc
  4. 白话机器学习算法理论+实战之K近邻算法
  5. catboost和xgboost_Catboost:超越Lightgbm和XGBoost的又一个boost算法神器
  6. iconfont 图标转为字体_iconfont字体图标的使用
  7. mac 卸载 安装mysql_SQL----mySQl卸载for mac
  8. Jetson Xavier NX远程登录
  9. 【面试 反思】Retrofit源码与设计 7 连问
  10. ImmunoChemistry艾美捷星孢菌素说明书