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

这篇具有很好参考价值的文章主要介绍了【进阶篇】MySQL的SQL解析原理详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【进阶篇】MySQL的SQL解析原理详解,MySQL从入门到精通,sql,mysql,数据库,后端,运维

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的语法规则被组织成一棵语法树。

【进阶篇】MySQL的SQL解析原理详解,MySQL从入门到精通,sql,mysql,数据库,后端,运维

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

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

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

4. 语法分析树

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

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

【进阶篇】MySQL的SQL解析原理详解,MySQL从入门到精通,sql,mysql,数据库,后端,运维

在这棵树中,每一个节点都代表一个语法结构,从整个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语句的结构。

【进阶篇】MySQL的SQL解析原理详解,MySQL从入门到精通,sql,mysql,数据库,后端,运维

  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文章来源地址https://www.toymoban.com/news/detail-707684.html

到了这里,关于【进阶篇】MySQL的SQL解析原理详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL高级(进阶)SQL语句

    #显示一个字段或者多个字段的所有内容 SELECT “字段” FROM 表名 ; #distinct对字段去重查询 (最好只对单个字段进行去重) SELECT DISTINCT 字段名 FROM 表名 #where 有条件查询 SELECT “字段” FROM 表名 WHERE 条件(例如:sales =!= 100); #and or 查看多个条件 SELECT “字段” FROM 表名 WHE

    2024年02月05日
    浏览(44)
  • MySQL 高级(进阶) SQL 语句

     创建两表以供使用   ---- SELECT ----显示表格中一个或数个字段的所有数据记录 ---- DISTINCT ----不显示重复的数据记录 ---- WHERE ----有条件查询 ---- AND OR ----且 或 ---- IN ----显示已知的值的数据记录 ---- BETWEEN ----显示两个值范围内的数据记录(包含边界值) ---- 通配符 ----通常通配

    2024年02月10日
    浏览(52)
  • MySQL进阶SQL语句(二)

    视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。

    2024年02月11日
    浏览(41)
  • MySQL 高级(进阶) SQL 语句二

    MYSQL数据库中的三种连接: inner join(内连接):只返回两个表中联结字段相等的行(有交集的值) left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录 注:oracle数据库支持 outer

    2024年02月07日
    浏览(45)
  • 【MySQL进阶】SQL性能分析

    MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令,可以查看当前数据库的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的访问频次: Com_delete: 删除次数    Com_insert: 插入次数 Com_select: 查询次数   Com_update: 更新次数 我们可以在当前数据库

    2024年02月07日
    浏览(59)
  • 【数据库】MySQL 高级(进阶) SQL 语句

    location表格创建 store_info表格创建 显示表格中一个或数个字段的所有数据记录 不显示重复的数据记录 按照条件进行查询 在已知的字段数据取值范围内取值 另外还有not in命令,用法一致,表示显示不在指定范围内的字段的值。 在两个字段数据值之间取值,包含两边字段的数据

    2024年02月09日
    浏览(137)
  • MySQL进阶SQL语句2之表连接

    目录 1.连接查询 1.1inner(内连接) 1.2left join(左连接)  1.3right join(右连接) 1.4直接查询两个表相同的字段值的数据 2. VIEW(视图) 2.1create view(创建视图)  2.2修改源表数据,视图数据也随之改变 2.3视图数据是否能修改 3. UNION(联集) 4.交集值 5.无交集值 6.CASE 7.空值

    2024年02月10日
    浏览(37)
  • MySQL进阶_5.逻辑架构和SQL执行流程

    不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是: 客户端进程向服务器进程发送一段文本(SQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。 上图的处理流程在MySQL5.7和8.0中有所不同,只是一个通用的处理流程,后续会有更详细

    2024年02月05日
    浏览(37)
  • Linux5.7 MySQL 高级(进阶) SQL 语句

    第四章 LINUX MySQL 高级(进阶) SQL 语句 一、高级SQL 语句 1.SELECT 显示表格中一个或数个字段的所有数据记录 2.DISTINCT 不显示重复的数据记录 3.WHERE 有条件查询 4.AND OR 且 或 5.IN 显示已知的值的数据记录 6.BETWEEN 显示两个值范围内的数据记录 7.通配符 通常通配符都是跟 LIKE 一起使用

    2024年02月09日
    浏览(50)
  • MySQL 语法SQL 命令解析

    MySQL 是一种常用的关系型数据库管理系统,使用 SQL(Structured Query Language)作为操作数据库的语言。 创建 database_name 数据库 删除 database_name 数据库 选择要使用的数据库 1.创建 table_name 的表,包含指定的列和约束 删除 table_name 的表 向 table_name 表中添加列、修改列定义或删除列

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包