绝对于其余编程语言,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 解析引擎的整体构造划分如下图所示。