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

基础示例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容