Sharding-JDBC 数据源分片:基于原生 JDBC 的多表绑定分片方案

本文介绍 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_orderFROM 的最左侧,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

基础示例

你可能感兴趣的:(Sharding-JDBC 数据源分片:基于原生 JDBC 的多表绑定分片方案)