首页 > 数据库 >分布式 | DBLE 之 SQL 解析

分布式 | DBLE 之 SQL 解析

时间:2022-12-20 15:08:08浏览次数:40  
标签:语法 语法分析 词法 DBLE SQL 序列 解析 分布式


作者:路路
热爱技术、乐于分享的技术人,目前主要从事数据库相关技术的研究。


数据库中间件与数据库有什么区别?

个人认为除了没做数据存储,其他的功能数据库中间件几乎一样不少,比如 SQL 解析、结果集处理、协议实现等。

SQL 解析的定义

今天我们主要来谈谈 SQL 解析,SQL 的全称为 Structured Query Language,即结构化查询语言,既然定义为语言,那其实它和任何其他语言都是平等的。所以对 SQL 的解析完全等同于对任何一门语言的解析,对编程语言的解析这就涉及到编译原理相关知识了。

想要解析一门语言,通常需要具备以下工具:

  • 词法分析器(Lexer):负责解析基本的词法,也就是将字符序列转换为单词(Token)序列的过程。
  • 语法分析器(Parser):将词法分析器解析出的单词(Token)序列,进一步构建成有语义的数据结构,比如抽象语法树。
  • 访问器(Visitor):能够对语法分析器生成的抽象语法树进行遍历,获取需要的信息。

上面的定义可能大家看完还有点懵懂,这里我通过一个实际的例子来让大家有个更具体的认识。

案例解析

原始 SQL 如下:

SELECT id, name FROM test WHERE ID > 2 LIMIT 2;

下面我们来解析这个 SQL:

1. 词法分析

词法分析是将字符序列转换为单词(Token)序列的过程,所以上面的 SQL 经过词法分析后,将会变成这样一串序列:

分布式 | DBLE 之 SQL 解析_mycat

是的,大家也许看出来了,词法分析就是拆分字符序列(是的,没错,我们都能自己写个词法分析器)。

2. 语法分析

语法分析是将词法分析器解析出的单词(Token)序列,进一步构建成有语义的抽象语法树(为什么是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节,比如上面拆分出来的“,”就不需要再数据结构中展现了)。

经过语法分析,上述序列将呈现如下结构:

分布式 | DBLE 之 SQL 解析_开源_02

同学们看到这里,应该知道语法分析器的作用了吧,其实就是把单词(TOKEN)序列转换成相应的数据结构,因为是树形的,又是“抽象”的,所以就叫抽象语法树了,看起来高端,其实大家也能自己写个语法分析器。

完成了上面两步,SQL 语法解析就已经完成了,至于遍历器,其实就是访问抽象语法树中的结构的。

总结

对于 SQL 解析,难道我们真的要手写吗?答案是当然不用啦,毕竟我们不是第一个吃螃蟹的人,DRUID 已经帮我们实现了 SQL 解析的功能,所以我们可以直接拿来用。DRUID 中的词法分析器以及语法分析器都是纯手写的,效率也很快。这里同学们可能会问,难道还有不用手写的吗?答案是肯定的,ANLTR 就可以帮你生成相应的解析器,不过还是需要你定义规则的。

DBLE 中 SQL 解析用的是 DRUID 实现,其实 SQL 解析说白了就是理解 SQL,理解了 SQL 就知道它要干嘛了,所以 DBLE 中的 SQL 解析是为后面的路由、结果集处理等功能服务的。


标签:语法,语法分析,词法,DBLE,SQL,序列,解析,分布式
From: https://blog.51cto.com/u_15077536/5955397

相关文章

  • 技术分享 | MySQL 存储过程中的只读语句超时怎么办?
    作者:杨涛涛资深数据库专家,专研MySQL十余年。擅长MySQL、PostgreSQL、MongoDB等开源数据库相关的备份恢复、SQL调优、监控运维、高可用架构设计等。目前任职于爱可生,为......
  • 第07期:有关 MySQL 字符集的 SQL 语句
    本篇为理清字符集的续篇​​(上一篇:第06期:梳理MySQL字符集的相关概念)​​,重点讲述字符集涉及到的sql语句用法。一、characterintroducer翻译过来就是字符引导。也就是针......
  • 故障分析 | MySQL OOM 故障应如何下手
    作者:孙祚龙爱可生南区分公司交付服务部成员,实习工程师。负责公司产品问题排查及日常运维工作。。引言前阵子处理这样一个案例,某客户的实例mysqld进程内存经常持续增加导......
  • 技术分享 | my2sql 与 binlog2sql 解析效率 battle
    作者:杨彩琳爱可生华东交付部DBA,主要负责MySQL日常问题处理及DMP产品支持。爱好跳舞,追剧。前言**大家在平时运维过程中应该都了解过或者使用过一些binlog解析工具,比如今天......
  • 故障分析 | MySQL 优化案例 - 字符集转换
    作者:xuty本文关键字:SQL优化、字符集一、背景Serverversion:5.7.24-logMySQLCommunityServer(GPL)开发联系我,说是开发库上有一张视图查询速度很慢,9000条数据要查10......
  • 分布式 | 从 dble 日志分析到 MySQL 源码学习
    作者:袁琳铸爱可生DBLE团队开发成员,主要负责DBLE需求开发,故障排查和社区问题解答。背景在客户的生产环境中,dble.log时常出现nohandler日志。虽然没有影响客户业务的......
  • 分布式 | DBLE 新全局表检查实现浅析
    作者:孙正方爱可生DBLE核心研发成员,拥有丰富的分布式数据库中间件开发、咨询以及调优经验,擅长数据库中间件问题排查和处理,对线上中间件部分排错有深入的实践与认知。背景......
  • 第08期:有关 MySQL 字符集的注意事项
    本文关键字:字符集、建库建表一、数据库和字符集1、建库时指定创建数据库时,显式指定字符集和排序规则,同时,当切换到当前数据库后,参数character_set_database,collation_databa......
  • 故障分析 | 有效解决 MySQL 行锁等待超时问题【建议收藏】
    作者:xuty本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。一、背景####2019121910:10:10,234|com.alibaba.druid.filter......
  • 故障分析 | MySQL 优化案例 - select count(*)
    作者:xuty本文关键字:count、SQL、二级索引一、故事背景项目组联系我说是有一张500w左右的表做selectcount(*)速度特别慢。二、原SQL分析Serverversion:5.7.24-logMy......