【进阶篇】MySQL的SQL解析原理详解

news2024/12/23 9:36:30

文章目录

  • 0. 前言
  • 1. SQL解析过程
    • 1. 词法分析
    • 2. 语法分析
    • 4. 语法分析树
    • 5. MySQL语法分析树生成过程
    • 6. 核心数据结构及其关系
    • 7. SQL解析的应用
  • 2. 参考文档

在这里插入图片描述

0. 前言

  1. 你是否已经深入了解了MySQL中 SQL解析过程,以及解析过程中每个环节扮演的具体角色?
  2. 你是否好奇MySQL是如何将一条SQL语句解析成一系列的"Item"和"TABLE_LIST" 最终通过 这些完成指令的执行和结果的反馈
  3. 你是否清楚在查询优化和执行阶段MySQL进行了哪些处理的?

那么,让我们一起深入了解一下MySQL的SQL解析原理吧。本文参考了美团技术团队的《SQL解析在美团的应用》

1. SQL解析过程

1. 词法分析

这一步主要是将SQL语句分解为一个个的词法单元(Token)。例如,“SELECT * FROM table WHERE
id=1"这条SQL语句会被分解为"SELECT”、“*”、“FROM”、“table”、“WHERE”、“id”、“=”、"1"等词法单元。

词法分析是SQL解析过程的第一步,它主要是将输入的SQL文本分解成一个个的Token。这个过程类似于我们阅读文章时从左到右逐字逐句理解文章的意思。在计算机中,这些符号或词组被称为Token。

在SQL语句中,Token可能是一个关键字,比如"SELECT"、“FROM”、“WHERE"等;也可能是一些标识符,比如表名、字段名等;还可能是一些操作符,比如”+“、”-“、”*“、”/"等;也可能是一些字面值,比如字符串、数字、日期等。

词法分析的目标是将这些Token识别出来,并为语法分析阶段做准备。词法分析器会忽略所有的空格、制表符、换行符等,并且通常会产生一种内部的数据结构,如Token序列,以便于后续的语法分析阶段使用

2. 语法分析

在词法分析的基础上,语法分析会根据预先定义的SQL语法规则,检查词法单元的组合是否符合语法规则,并构建出一棵语法解析树(Parse Tree)。如果SQL语句不符合语法规则,语法分析就会失败,SQL语句就被认为是无效的。

假设我们有一个简单的SQL查询语句:SELECT name FROM student WHERE age > 20;

在词法分析阶段,这个语句会被分解成一系列的Token,

SELECT, name, FROM, student, WHERE, age, >, 20, ;

在语法分析阶段,这些Token会按照SQL的语法规则被组织成一棵语法树。

在这里插入图片描述

在这棵语法树中,每个节点代表一个语法单位,例如"SELECT"、"FROM"和"WHERE"代表不同的SQL子句,“name"和"student"代表列名和表名,”>"代表比较操作,"20"代表比较的数值。

这个语法树反映了SQL语句的语法结构,并为后续的语义分析和查询优化提供了基础。
讲起来可能有点抽象,看过编译原理内容的话,应该很好理解

对于未接触过编译器实现的同学,肯定会好奇如何才能生成这样的语法树。其背后的原理都是编译器的范畴,可以参考维基百科的一篇文章,以及该链接中的参考书籍。本人也是在学习MySQL源码过程中,阅读了部分内容。由于编译器涉及的内容过多,本人精力和时间有限,不做过多探究。从工程的角度来说,学会如何使用Bison去构建语法树,来解决实际问题,对我们的工作也许有更大帮助。下面我就以Bison为基础,探讨该过程。

4. 语法分析树

语法分析树是一个树形结构,每一个节点代表一个语法结构(如一个表达式、一个子句等)。树的根节点代表整个SQL语句,树的叶节点代表词法单元。通过遍历这棵树,我们就能够得到SQL语句的结构和语义。
是的,你描述得非常准确。语法分析树(或者说解析树、派生树)是一种用于表示输入符合给定语法的树形图。在计算机科学,尤其是编译器的设计与实现中,语法分析树扮演了重要的角色。它通常是编译器或者解释器的一个中间步骤,对输入进行语法检查并将其转换为内部的数据结构,从而方便后续的处理步骤。

对于SQL语句来说,通过构造其语法分析树,我们可以更好地理解SQL语句的结构并进行相应的操作,例如查询优化、语句重写等。

在这里插入图片描述

在这棵树中,每一个节点都代表一个语法结构,从整个SQL语句(根节点),到各个子句(非叶节点),再到具体的词法单元(叶节点)。通过遍历这棵树,我们就能得到SQL语句的结构和语义。

5. MySQL语法分析树生成过程

MySQL使用了一个名为Bison的工具来生成语法分析器。Bison会根据我们提供的语法规则,自动产生一个能够将词法单元组装成语法解析树的程序。

Bison是一个开源的解析器生成器,由GNU项目开发。它可以根据给定的上下文无关文法自动生成对应的语法分析器。

在MySQL中,Bison主要负责将词法分析器(由Flex生成)输出的词法单元组装成语法分析树。实际上,Bison并不直接生成树形结构的输出,而是生成自顶向下的递归下降解析器(或LR解析器),通过调用预定义的动作和规约操作来逐步构造语法分析树

具体来说,MySQL的Bison输入文件定义了一系列的产生式(即上下文无关文法的规则)和与之关联的动作。每当Bison解析器在输入流上识别出一个产生式,就会执行相应的动作。这些动作主要包括创建新的语法结构对象(如表达式、查询)并将其添加到当前的语法解析树中。

因此,通过Bison,MySQL可以将词法分析的结果进行语法解析,生成对应的语法分析树,从而进行进一步的处理,例如查询优化和执行计划的生成等。

关于生成语法分析器 如果作JAVA开发应该了解过最著名的ANTLR 一个强大的解析器生成器,支持包括Java,C#,Python,JavaScript,Ruby,Swift等在内的多种语言)简直功能强大无敌的存在,几乎遇到语法解析的框架中都在借鉴实现或者直接引用使用。还有JavaCC (Java Compiler Compiler)一个Java解析器生成器。

6. 核心数据结构及其关系

在MySQL中,最核心的数据结构是"Item"和"TABLE_LIST"。"Item"代表一个表达式,"TABLE_LIST"代表一个表。它们之间通过各种关系(如连接、子查询等)连接在一起,共同构成了SQL语句的结构。

在这里插入图片描述

  1. Item:在MySQL中,"Item"是一个抽象的概念,用来表示SQL语句中的一个表达式。这个表达式可能是一个常量、一个变量、一个函数调用,也可能是一个更复杂的表达式。例如,在SQL语句"SELECT a + b FROM t"中,"a + b"就是一个"Item"

  2. TABLE_LIST:这个数据结构代表了SQL语句中的一个表。它包含了表的名称、别名,以及其他与表相关的信息。“TABLE_LIST”是MySQL处理SQL语句中的表时,需要首先解析和处理的重要数据结构。

这两个结构在MySQL的处理流程中占据了重要地位。在解析SQL语句时,MySQL会首先将语句解析为一系列的“Item”和“TABLE_LIST”,然后在查询优化和执行阶段,根据这些“Item”和“TABLE_LIST”,进行各种复杂的计算和操作。

7. SQL解析的应用

SQL解析的最主要应用就是在数据库中执行SQL语句。除此之外,它还被用于各种数据库工具中,如性能优化工具、SQL审计工具等。

  1. 无用条件去除:在SQL解析的过程中,我们可以通过对语法解析树的分析,找出并去除那些无用的条件。例如,"WHERE 1=1"就是一个无用的条件。

  2. SQL特征生成:通过分析语法解析树,我们可以提取出SQL语句的各种特征,如查询的表、查询的列、使用的函数等。这些特征可以用于SQL分类、SQL相似度计算等任务。

2. 参考文档

建议大家看下这篇美团写的很是详细。
《SQL解析在美团的应用 作者: 广友》 https://tech.meituan.com/2018/05/20/sql-parser-used-in-mtdp.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/957478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法 解决方法: 1、先检查以下mysql的端口状态 netstat -anp|grep mysql如果显示127.0.0.1:3306 则说明需要修改,若为: : :3306,则不用。 在**/etc/mysql/mysql.conf.d/mysqld.cnf**&am…

软件测试之黑盒测试、白盒测试分别是什么?有什么区别?

软件开发过程中,为了保证软件质量和稳定性,必须进行全面而细致的测试工作,而黑盒测试和白盒测试正是两种常用的测试方法。 一、黑盒测试 黑盒测试是一种基于软件外部功能的测试方法。测试人员对待测试的软件系统,就像一个黑匣子…

uniapp-秋云图表 ucharts echarts 对比与关系

科普: 秋云图表库,包含二种配置属性对应二种js配置文件。 一种是 :echarts.js,一种是 : ucharts。 二者的配置属性不一样! ucharts和echarts对比 ucharts和echarts都是用于数据可视化的开源JavaScript库,它…

【高危】Apache Airflow Spark Provider 反序列化漏洞 (CVE-2023-40195)

zhi.oscs1024.com​​​​​ 漏洞类型反序列化发现时间2023-08-29漏洞等级高危MPS编号MPS-qkdx-17bcCVE编号CVE-2023-40195漏洞影响广度广 漏洞危害 OSCS 描述Apache Airflow Spark Provider是Apache Airflow项目的一个插件,用于在Airflow中管理和调度Apache Spar…

自动化机器学习Auto-Sklearn安装和使用教程

安装和使用 Auto-Sklearn Auto-sklearn 提供了开箱即用的监督型自动机器学习。从名字可以看出,auto-sklearn 是基于机器学习库 scikit-learn 构建的,可为新的数据集自动搜索学习算法,并优化其超参数。因此,它将机器学习使用者从繁琐的任务中解放出来,使其有更多时间专注于…

django/CVE-2017-12794XSS漏洞复现

docker搭建漏洞复现环境 漏洞原理看帮助文档 # Django debug page XSS漏洞(CVE-2017-12794)分析Django发布了新版本1.11.5,修复了500页面中可能存在的一个XSS漏洞,这篇文章说明一下该漏洞的原理和复现,和我的一点点评…

一种借助MYSQL递归CTE生成所有组合情况的实现方法

需求说明 有如下表和数据: Nname1户口2查询机构数过多3危险驾驶4多头用信 需要输出name里的所有组合情况,即单个值,两两组合,三个组合、四个组合。结果为2的n次方-1中情况,这里是15。 预期结果为: Com…

【OpenCV入门】第四部分——阈值

文章结构 阈值概述阈值处理函数二值化阈值处理二值化阈值处理反二值化处理 零处理低于阈值零处理超出阈值零处理 截断处理自适应处理Otsu方法 阈值概述 在PhotoShop里头,有一个工具可以快速抠出一幅图像中的轮廓,这个工具就是阈值。OpenCV也提供了阈值&…

springboot实战(二)之将项目上传至远程仓库

目录 环境: 背景: 操作: 1.注册码云账号 2.创建仓库 步骤: 1.注册完码云账号后,点击加号,新建仓库 2.输入项目名称和介绍,点击创建 3.复制仓库地址,你可以选择https协议或者…

ClickHouse进阶(五):副本与分片-2-Distributed引擎

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅…

ssm+vue宠物领养系统源码和论文

ssmvue宠物领养系统源码和论文103 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 本课题是根据用户的需要以及网络的优势建立的一个宠物领养系统,来满足用宠物领养的需求。 本宠物领养系统…

抖音短视频账号矩阵seo分发系统--开发源代

1.抖音矩阵号/抖音短视频SEO矩阵系统开发及开发者思路分享: 短视频获客系统开发原型支持短视频智能批量剪辑、短视频多账号管理定时发布,短视频排名查询及优化,智能客服私信回复等,那么短视频seo系统开发时需要开发哪些功能呢?今天…

全能图片转文字:多功能图片转换工具

全能图片转文字是一款功能丰富的图片转文字软件,通过OCR文字识别技术能够轻松识别图片中的文字信息,并快速提取转换成文本格式。除了支持图片转文字,全能图片转文字还可以完成音频转文字、视频转文字、截图转文字等操作,轻松满足日…

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测; 2.单变量时间序列数…

春秋云镜 CVE-2018-20604

春秋云镜 CVE-2018-20604 lfdycms任意文件读取 靶标介绍 雷风影视CMS是一款采用PHP基于THINKPHP3.2.3框架开发,适合各类视频、影视网站的影视内容管理程序,该CMS存在缺陷,可以通过 admin.php?s/Template/edit/path/web………*…*1.txt 的方…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 为什么要学习 ES? 强大的全文搜索和检索功能:Elasticsearch 是一个开源的分布式搜索和分析引擎,使用倒排索引和分布式计算等技术,提供了强大的全文搜索和检索功能。学习 ES 可以掌握如何构建复…

STM32实现FFT,求取幅度频谱

STM32实现FFT,求取幅度频谱 FFT不太对劲的理解 FFT的原理比较复杂,因为32使用FFT不用去管算法是如何运作的,我在这里就进行简单的介绍了。 因为是简单介绍,就只介绍下幅度频谱图,不考虑相位频谱图。 ​ FFT可以将一个…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——综合推理

角度——重难点 综合推理条件优先级口诀 事实问题优先看,数量不定先计算。 半事实条件可分类,重复元素是关键。 题干如果多假言,就要优先做串联。 题干只有一假言,否后或者找矛盾。 特殊条件优先看,其他条件放后边。

Mybatis 插入、修改、删除

前面几篇我们介绍了使用Mybatis查询数据,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。 如果您对查询数据和Mybatis集成JDK日志系统不太了解,建议您先进行了解后再阅…

DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优

一分钟速通ACPI和鲲鹏软件移植 操作系统内核鲲鹏软件移植鲲鹏软件移植流程 编译工具选择编译参数移植案例源码修改案例鲲鹏分析扫描工具 Dependency Advisor鲲鹏代码迁移工具 Porting Advisor 鲲鹏软件性能调优鲲鹏软件性能调优流程CPU与内存子系统性能调优网络子系统性能调优磁…