目录
- 1、SQL解析
- 2、SQL路由
- 3、SQL改写
- 4、SQL执行
- 5、结果归并
1、SQL解析
当Sharding-JDBC接受到一条SQL句子将陆续执行 SQL解析 => 查询优化 => SQL路由 => SQL改写 => SQL执行 =>结果归并
,最终返回执行结果。 SQL分析过程分为。 用于将词法分析器SQL拆解为不可分割的原子符号,称为。并将不同数据库方言提供的字典分类为关键字、表达式、字面量和操作符。 再次使用语法解析器SQL转换为抽象语法树。例如:
SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18
抽象语法树中的关键语法树中的关键词Token变量用绿色表示Token用红色表示,灰色表示需要进一步拆分。
最后,通过对抽象语法树的遍历提炼分片所需,可能需要标记的位置。 分片使用的分析包括查询选项(Select Items)、表信息(Table)、分片条件(Sharding Condition)、主要信息自增(Auto increment PrimaryKey)、排序信息(Order By)、分组信息(Group By)以及分页信息(Limit、Rownum、Top)。
2、SQL路由
SQL路由就是针对的数据操作映射到对数据结点操作的过程。
分析数据库和表的分片策略,生成路由路径。 携带分片键SQL,根据分片键操作符不同可以划分为单片路由(分片键的操作符是等号)、多片路由(分片键的操作符是IN)和范围路由(分片键的操作符是BETWEEN),不携带分片键SQL则采用。路由场景根据分片键可分为等。
标准路由是Sharding-Jdbc最推荐的分片方法,其适用范围不包括关联查询或只包括绑定表之间的关联查询SQL。 当分片运算符等于号时,路由结果将落入单库(表),当分片运算符是BETWEEN或IN当路由结果不一定落入唯一的库(表)时,。
笛卡尔路由是最复杂的情况,不能根据绑定表的关系定位分片规则。因此,需要将非绑定表之间的关联查询分解为笛卡尔积组合,如user_0/1,与account_0/1关联时,可能会在每个事实表之间进行关联查询(产生四条SQL)。
3、SQL改写
程序写在逻辑表上。SQL,不能直接在真实数据库中执行,SQL将逻辑改写SQL改写可以在真实数据库中正确执行SQL。
如果用于,不用于返回的字段sharding-jdbc将添加到返回字段中,比如:
<!--逻辑表SQL--> SELECT order_id FROM t_order ORDER BY user_id; <!--SQL改写--> SELECT order_id, user_id AS ORDER_BY_DERIVED_0 FROM t_order ORDER BY user_id;
4、SQL执行
Sharding-JDBC采用一套自动执行引擎,负责路由和重写后的真实性SQL安全高效地发送到底层数据源。 它不是简单的SQL通过JDBC直接发送到数据源执行;并非直接将执行请求放入线程池并发执行。它更注重平衡数据源连接的创建和内存占用的消耗,以及并发的合理利用。 执行引擎的目标是自动平衡资源控制和执行效率自动平衡资源控制和执行效率:
Sharding-JDBC不限制一次操作消耗的数据库连接数量。 如果实际执行的SQL如果需要操作数据库实例中的200个表,则为每个表创建一个新的数据库连接,并通过多线程并发处理,以最大限度地提高执行效率。
Sharding-JDBC严格控制一次操作消耗的数据库连接数量。 若实际执行SQL如果需要操作数据库实例中的200张表,则只会创建唯一的数据库连接,并串行处理200张表。 如果一次操作中的分片散落在不同的数据库中,不同数据库的操作仍然采用多线程处理,但是。
5、结果归并
将从每个数据节点获取的多数据结果集组合成一个结果集,并正确返回到请求客户端,。Sharding-JDBC支持的结果合并可分为五种类型:遍历、排序、分组、分页和聚合,它们是组合而不是相互排斥。
合并引擎的整体结构分为下图: 结果分为结构划分。流式归并和内存合并是相互排斥的,装饰者合并可以进一步处理流式合并和内存合并。
很容易理解,他是将所有分片结果集的数据都遍历并存储在内存中,再通过统一的分组、排序以及聚合等计算之后,再将其封装成为逐条访问的数据结果集返回。
是指每次从数据库结果中获得的数据都可以通过返回正确单个数据的方式最符合数据库原始返回结果集的方式。如下图所示:
它增强了所有结果的统一功能,如合并时需要聚合SUM在进行聚合计算之前,结果集将通过内存合并或流式合并查询。因此,聚合合并是在之前介绍的合并类型上增加的合并能力,即装饰模式。