绝对于其余编程语言,SQL是比较简单的。
不过,它仍然是一门欠缺的编程语言,因而对SQL的语法进行解析,与解析其余编程语言(如:Java语言、C语言、Go语言等)并无本质区别。
形象语法树
解析过程分为词法解析和语法解析。
词法解析器用于将SQL拆解为不可再分的原子符号,称为Token。并依据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面量和操作符。
再应用语法解析器将SQL转换为形象语法树。
例如,以下SQL:
SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18
解析之后的为形象语法树见下图。
为了便于了解,形象语法树中的关键字的Token用绿色示意,变量的Token用红色示意,灰色示意须要进一步拆分。
最初,通过对形象语法树的遍历去提炼分片所需的上下文,并标记有可能须要改写的地位。
供分片应用的解析上下文蕴含查问选择项(Select Items)、表信息(Table)、分片条件(Sharding Condition)、自增主键信息(Auto increment Primary Key)、排序信息(Order By)、分组信息(Group By)以及分页信息(Limit、Rownum、Top)。
SQL的一次解析过程是不可逆的,一个个Token的按SQL本来的程序顺次进行解析,性能很高。
思考到各种数据库SQL方言的异同,在解析模块提供了各类数据库的SQL方言字典。
SQL解析引擎
SQL解析作为分库分表类产品的外围,其性能和兼容性是最重要的掂量指标。
ShardingSphere的SQL解析器经验了3代产品的更新迭代。
第一代SQL解析器为了谋求性能与疾速实现,在1.4.x之前的版本应用Druid作为SQL解析器。经理论测试,它的性能远超其它解析器。
第二代SQL解析器从1.5.x版本开始,ShardingSphere采纳齐全自研的SQL解析引擎。
因为目标不同,ShardingSphere并不需要将SQL转为一颗齐全的形象语法树,也无需通过拜访器模式进行二次遍历。它采纳对SQL半了解
的形式,仅提炼数据分片须要关注的上下文,因而SQL解析的性能和兼容性失去了进一步的进步。
第三代SQL解析器则从3.0.x版本开始,ShardingSphere尝试应用ANTLR作为SQL解析的引擎,并打算依据DDL -> TCL -> DAL –> DCL -> DML –>DQL
这个程序,顺次替换原有的解析引擎,目前仍处于替换迭代中。
应用ANTLR的起因是心愿ShardingSphere的解析引擎可能更好的对SQL进行兼容。对于简单的表达式、递归、子查问等语句,尽管ShardingSphere的分片外围并不关注,然而会影响对于SQL了解的友好度。
通过实例测试,ANTLR解析SQL的性能比自研的SQL解析引擎慢3-10倍左右。为了补救这一差距,ShardingSphere将应用PreparedStatement
的SQL解析的语法树放入缓存。
因而倡议采纳PreparedStatement
这种SQL预编译的形式晋升性能。
第三代SQL解析引擎的整体构造划分如下图所示。