表关联 #
原理 #
DBPlusEngine 表关联目前支持多个分片表为绑定表场景的关联查询,以及广播表和分片表、广播表和单表的关联查询,不支持非绑定表的多个分片表关联查询,以及分片表和单表,单表和单表的跨库关联查询。
DBPlusEngine 在处理表关联查询时,尽可能地将关联查询下推至底层数据库执行,充分使用原生数据库的计算能力,DBPlusEngine 会对底层数据库返回的结果集进行归并,使得最终的结果满足逻辑 SQL 的关联查询语义。
建议 #
- 使用绑定表进行多表关联查询时,通过使用分片键进行关联,可以避免笛卡尔积关联,从而提升查询效率;
- 对于分片表和其他表关联的场景,可以将大表根据业务场景进行分片,需要关联的小表可以采用广播方式下发到各个数据源,当分片表和广播表需要关联查询时,选择当前数据源上的广播表关联即可;
- 对于业务场景中单独使用,不需要和分片表关联的小表,可以将它们存储在指定的数据源上,以单表的形式进行更新和查询。
示例 #
以如下的 SQL 为例,我们来对比下使用绑定表和非绑定表关联的差异。
SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
- 在不配置绑定表关系时,假设分片键 order_id 将数值 10 路由至第 0 片,将数值 11 路由至第 1 片,那么路由后的 SQL 应该为 4 条,它们呈现为笛卡尔积:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
- 在配置绑定表关系,并且使用
order_id
进行关联后,路由的 SQL 应该为 2 条:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
可以看出配置绑定表关系之后,查询的效率大大提升。