本文介绍 Sharding-JDBC 数据源分片之基于原生 JDBC 的多表绑定分片方案。
目录
- Sharding-JDBC 绑定表概念介绍
- 开发环境
- 基础示例
- 总结
Sharding-JDBC 绑定表概念介绍
Sharding-JDBC 绑定表是指分片规则一致的主表和子表,如:t_order
(订单)表和 t_order_item
(订单项)表都按照 order_id
分片,则此两行表互为绑定表关系。
绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。如执行以下 SQL 查询:
SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (1, 2);
假设分片键 order_id
将数值 1
路由到第1片,将数值 2
路由到第0片,则在不配置绑定表关系时,路由的 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 (1, 2);
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 (1, 2);
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 (1, 2);
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 (1, 2);
配置绑定表关系后路由的 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 (1, 2);
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 (1, 2);
其中 t_order
在 FROM
的最左侧,Sharding-JDBC 将会以 t_order
为绑定关系中的主表。所有路由计算将会只使用主表的策略,因此 t_order_item
表的分片计算将会使用 t_order
的条件,所以绑定表之间的分片键要完全相同。
开发环境
- Oracle JDK 1.8.0_201
- Apache Maven 3.6.0
- IntelliJ IDEA (Version 2018.3.3)
- MySQL 5.6.38