您的位置 首页 基础

一文详解SQL解析与使用

一文详解SQL解析与应用-为了避免这种损失,一般会在管理上下功夫,比如为研发人员制定数据库开发规范;新上线的SQL,需要DBA进行审核;维护操作需要经过领导审批等等。而且如果希望能够有效地管理这些措施,需要有效的数据库培训,还需要DBA细心的进行SQL审核。很多中小型创业公司可以通过设定规范、进行培训、完善审核流程来管理数据库。

数据库作为中心的根底组件,是需求重点保护的目标。任何一个线上的不小心操作,都有可能给数据库带来严峻的毛病,然后给事务形成巨大的丢失。

为了防止这种丢失,一般会在办理上下功夫,比方为研制人员拟定数据库开发标准;新上线的SQL,需求DBA进行审阅;保护操作需求经过领导批阅等等。而且假如期望能够有用地办理这些方法,需求有用的数据库训练,还需求DBA仔细的进行SQL审阅。许多中小型创业公司能够经过设定标准、进行训练、完善审阅流程来办理数据库。

跟着美团点评的事务不断发展和强大,上述方法的施行本钱越来越高。怎么更多的依靠技能手段,来进步功率,越来越受到重视。业界已有不少依据MySQL源码开发的SQL审阅、优化主张等东西,极大的减轻了DBA的SQL审阅担负。那么咱们能否持续扩展MySQL的源码,来辅佐DBA和研制人员来进一步进步功率呢?比方,更全面的SQL优化功用;多维度的慢查询剖析;辅佐毛病剖析等。要完结上述功用,其间最中心的技能之一便是SQL解析。

现状与场景

SQL解析是一项杂乱的技能,一般都是由数据库厂商来把握,当然也有公司专门供给SQL解析的API。

由于这几年MySQL数据库中间件的鼓起,需求支撑读写别离、分库分表等功用,就必须从SQL中抽出表名、库名以及相关字段的值。因而像Java言语编写的Druid,C言语编写的MaxScale,Go言语编写的Kingshard等,都会对SQL进行部分解析。而真实把SQL解析技能用于数据库保护的产品较少,主要有如下几个:

美团点评开源的SQLAdvisor。它依据MySQL原生态词法解析,结合剖析SQL中的where条件、聚合条件、多表Join联系给出索引优化主张。

上述产品都有十分适宜的运用场景,在业界也被广泛运用。可是SQL解析的运用场景远远没有被充沛开掘,比方:

依据表粒度的慢查询报表。比方,一个Schema中包括了归于不同事务线的数据表,那么从事务线的视点来说,其期望供给表粒度的慢查询报表。

生成SQL特征。将SQL句子中的值替换成问号,便利SQL归类。尽管能够运用正则表达式完结相同的功用,可是其Bug较多,能够参阅pt-query-digest。比方pt-query-digest中,会把遇到的数字都替换成“?”,导致无法差异不同数字后缀的表。

高危操作承认与躲避。比方,DBA不小心Drop数据表,而此类操作,现在还无有用的东西进行回滚,尤其是大表,其结果将是灾难性的。

SQL合法性判别。为了安全、审计、操控等方面的原因,美团点评不会让研制人员直接操作数据库,而是供给RDS服务。尤其是关于数据改变,需求研制人员的上级主管进行事务上的批阅。假如研制人员,写了一条语法错误的SQL,而RDS无法判别该SQL是否合法,就会形成不必要的交流本钱。

因而为了让一切有需求的事务都能便利地运用SQL解析功用,咱们以为应该具有如下特性:

直接露出SQL解析接口,运用尽量简略。比方:输入SQL,则输出表名、特征和优化主张。

接口的运用不依靠于特定的言语,不然保护和运用的价值太高。比方:以HTTP等方法供给服务。

千里之行,始于足下,下面我先介绍下SQL的解析原理。

原理

SQL解析与优化是归于编译器领域,和C言语等其他言语的解析没有实质的差异。其间分为词法剖析、语法和语义剖析、优化、履行代码生成。对应到MySQL的部分,如下图:

一文详解SQL解析与运用

SQL解析原理

1、词法剖析

SQL解析由词法剖析和语法/语义剖析两个部分组成。词法剖析主要是把输入转化成一个个Token。其间Token中包括Keyword(也称symbol)和非Keyword。例如:SQL句子select username from userinfo,在剖析之后,会得到4个Token,其间有2个Keyword,分别为select和from:

一文详解SQL解析与运用

一般状况下,词法剖析能够运用Flex来生成。

可是MySQL并未运用该东西,而是手写了词法剖析部分。具体代码在sql/lex.h和sql/sql_lex.cc文件中。

MySQL中的Keyword界说在sql/lex.h中,如下为部分Keyword:

一文详解SQL解析与运用

词法剖析的中心代码在sql/sql_lex.c文件中的MySQLLex→lex_one_Token,有爱好的同学能够下载源码研讨。

2、语法剖析

语法剖析便是生成语法树的进程。这是整个解析进程中最精华、最杂乱的部分,不过这部分MySQL运用了Bison来完结。即使如此,怎么规划适宜的数据结构以及相关算法,去存储和遍历一切的信息,也是值得在这儿研讨的。

语法剖析树

SQL句子:

select username, ismale from userinfo where age 》 20 and level 》 5 and 1 = 1

会生成如下语法树:

一文详解SQL解析与运用

语法树

关于未触摸过编译器完结的同学,肯定会猎奇怎么才干生成这样的语法树,不过其背面的原理都是编译器的领域,咱们能够参阅维基百科的一篇文章,以及该链接中的参阅书本。自己也是在学习MySQL源码进程中,阅览了部分内容。

由于编译器触及的内容过多,自己阅历和时刻有限,不做过多探求。从工程的视点来说,学会怎么运用Bison去构建语法树,来处理实际问题,对咱们的作业或许有更大协助。下面我就以Bison为根底,讨论该进程。

MySQL语法剖析树生成进程

悉数的源码在sql/sql_yacc.yy中,在MySQL5.6中有17K行左右代码。这儿列出触及到SQL:

select username, ismale from userinfo where age 》 20 and level 》 5 and 1 = 1

解析进程的部分代码摘抄出来。其实有了Bison之后,SQL解析的难度也没有幻想的那么大。特别是这儿给出了解析的头绪之后。

代码示下:

一文详解SQL解析与运用

一文详解SQL解析与运用

一文详解SQL解析与运用

上下拉动可完好检查

在咱们阅览上述代码的进程,会发现Bison中嵌入了C++的代码。经过C++代码,把解析到的信息存储到相关目标中。例如表信息会存储到TABLE_LIST中,order_list存储order by子句里的信息,where字句存储在Item中。有了这些信息,再辅佐以相应的算法就能够对SQL进行更进一步的处理了。

中心数据结构及其联系

在SQL解析中,最中心的结构是SELECT_LEX,其界说在sql/sql_lex.h中。下面仅列出与上述比方相关的部分。

一文详解SQL解析与运用

SQL解析树结构

上面图示中,列名username、ismale存储在item_list中,表名存储在table_list中,条件存储在where中。其间以where条件中的Item层次结构最深,表达也较为杂乱,如下图所示:

一文详解SQL解析与运用

where条件

SQL解析的运用

为了更深化的了解SQL解析器,这儿给出2个运用SQL解析的比方:

1、无用条件去除

“无用条件去除”归于优化器的逻辑优化领域,只是依据SQL自身以及表结构即可完结,其优化的状况较多,代码在sql/sql_opTImizer.cc文件中的remove_eq_conds函数。为了防止过于繁琐的描绘,以及大段代码的张贴,这儿经过图片来剖析以下四种状况:

1=1 and (m 》 3 and n 》 4)

1=2 and (m 》 3 and n 》 4)

1=1 or (m 》 3 and n 》 4)

1=2 or (m 》 3 and n 》 4)

无用条件去除a:

一文详解SQL解析与运用

无用条件去除b

一文详解SQL解析与运用

无用条件去除c

一文详解SQL解析与运用

无用条件去除d

一文详解SQL解析与运用

假如对其代码完结有爱好的同学,需求对MySQL中的一个重要数据结构Item类有所了解。由于其比较杂乱,所以MySQL官方文档专门介绍了Item类。

参阅链接:https://dev.mysql.com/doc/internals/en/item-class.html

阿里的MySQL小组也有相似的文章。如需更具体的了解,就需求去检查源码中sql/item_*等文件。

2、SQL特征生成

为了保证数据库这一体系根底组件安稳、高效运转,业界有许多辅佐体系。比方慢查询体系、中间件体系。这些体系收集、收到SQL之后,需求对SQL进行归类,以便计算信息或许运用相关战略。归类时,一般需求获取SQL特征。比方SQL:

select username, ismale from userinfo where age 》 20 and level 》 5;

SQL特征为:

select username, ismale from userinfo where age 》 ? and level 》 ?

业界闻名的慢查询剖析东西pt-query-digest,经过正则表达式完结这个功用,可是这类处理方法Bug较多。接下来就介绍怎么运用SQL解析,完结SQL特征的生成。

SQL特征生成分两部分组成:

生成Token数组;

依据Token数组,生成SQL特征。

首要回忆在词法解析章节,咱们介绍了SQL中的关键字,而且每个关键字都有一个16位的整数对应,而非关键字统一用ident表明,其也对应了一个16位整数。如下表:

一文详解SQL解析与运用

将一个SQL转换成特征的进程:

一文详解SQL解析与运用

在SQL解析进程中,能够很便利的完结Token数组的生成。而一旦完结Token数组的生成,就能够很简略的完结SQL特征的生成。SQL特征被广泛用于各个体系中,比方pt-query-digest需求依据特征对SQL归类,然而其依据正则表达式的完结有许多Bug。下面罗列几个已知的Bug:

一文详解SQL解析与运用

学习主张

最近,在对SQL解析器和优化器探究的进程中,从一开端的茫然无措到有章可循,也总结了一些心得体会,在这儿跟咱们共享一下:

首要,阅览相关书本,书本能给咱们一个体系的知道解析器和优化器的视点。可是该类针对MySQL的书本市面上很少,现在中文著作能够看下《数据库查询优化器的艺术:原理解析与SQL功能优化》;

其次,要阅览源码,可是最好以某个版别为根底,比方MySQL5.6.23,由于SQL解析、优化部分的代码在不断改变,尤其是在跨越大的版别时,改动力度大;

再次,多运用GDB调试,验证自己的猜想,查验阅览质量;

最终,需求写相关代码验证,只要写出来了才干算真实的把握。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/101752.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部