Java中sharding-jdbc 綁定表的實現(xiàn)
在 ShardingSphere-JDBC 中,綁定表(Binding Table) 是解決跨庫表關(guān)聯(lián)查詢的核心機制之一,主要用于優(yōu)化分片鍵相同、分片規(guī)則一致的表之間的關(guān)聯(lián)查詢性能。通過綁定表,ShardingSphere 可以將關(guān)聯(lián)的兩張表路由到同一個物理庫,實現(xiàn)本地關(guān)聯(lián),避免跨庫查詢的開銷。
一、綁定表的定義與核心作用
1. 定義
綁定表是指分片鍵相同、分片算法一致的兩張或多張表。ShardingSphere 會基于分片鍵的路由結(jié)果,將這兩張表映射到同一個物理庫的本地表,確保關(guān)聯(lián)查詢可以在本地完成。
2. 核心作用
- 避免跨庫關(guān)聯(lián):關(guān)聯(lián)表路由到同一物理庫,無需跨庫網(wǎng)絡(luò)傳輸。
- 提升查詢性能:本地關(guān)聯(lián)效率遠高于跨庫關(guān)聯(lián)(尤其對大表)。
- 簡化分片規(guī)則:無需將關(guān)聯(lián)表配置為全局表(避免存儲冗余)。
二、綁定表的典型場景
最常見的是主子表關(guān)聯(lián)(如訂單表與訂單項表),兩者通常以相同字段(如 order_id)作為分片鍵,且分片規(guī)則一致。例如:
- 訂單表 t_order(分片鍵:order_id,按 order_id % 4 分片到 db_order_0~3)。
- 訂單項表 t_order_item(分片鍵:order_id,按 order_id % 4 分片到 db_order_item_0~3)。
此時,若直接關(guān)聯(lián)查詢 t_order 和 t_order_item,ShardingSphere 可能將它們路由到不同庫(如 t_order 到 db_order_0,t_order_item 到 db_order_item_1),導致跨庫關(guān)聯(lián)。通過綁定表,可強制兩者路由到同一庫(如 db_order_0 和 db_order_item_0)。
三、綁定表的配置步驟
以下以 Spring Boot 配置為例,演示訂單表 t_order 與訂單項表 t_order_item 的綁定表配置。
1. 場景說明
- 邏輯表:
t_order(訂單表)、t_order_item(訂單項表)。 - 分片鍵:兩者均以
order_id為分片鍵。 - 分片算法:均按
order_id % 4分片到 4 個庫(order_db_0~3)和本地表(t_order_0~3、t_order_item_0~3)。
2. 配置文件(application.yml)
spring:
shardingsphere:
datasource:
names: order_db_0, order_db_1, order_db_2, order_db_3 # 訂單庫的物理庫
# 省略具體數(shù)據(jù)源連接配置(每個物理庫需單獨配置)
rules:
sharding:
tables:
# 訂單表 t_order(邏輯表)
t_order:
actual-data-nodes: order_db_${0..3}.t_order_${0..3} # 路由到 order_db 的 0~3 庫,每個庫有 t_order_0~3 表
database-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: db_order_inline
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: table_order_inline
# 訂單項表 t_order_item(邏輯表,與 t_order 綁定)
t_order_item:
actual-data-nodes: order_db_${0..3}.t_order_item_${0..3} # 與 t_order 相同的庫和表分片規(guī)則
database-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: db_order_inline # 與 t_order 的庫分片算法一致
table-strategy:
standard:
sharding-column: order_id
sharding-algorithm-name: table_order_inline # 與 t_order 的表分片算法一致
# 分片算法(庫級和表級)
sharding-algorithms:
# 庫分片算法:order_id % 4 決定庫索引
db_order_inline:
type: INLINE
props:
algorithm-expression: order_db_${order_id % 4}
# 表分片算法:order_id % 4 決定表索引(每個庫內(nèi)有 4 張本地表)
table_order_inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 4}
# 綁定表配置(關(guān)鍵!)
binding-tables:
- t_order, t_order_item # 聲明 t_order 和 t_order_item 為綁定表
3. 關(guān)鍵配置說明
- binding-tables:顯式聲明綁定表列表,ShardingSphere 會基于此處理關(guān)聯(lián)查詢的路由。
- 分片策略一致:t_order 和 t_order_item 的庫分片算法(db_order_inline)和表分片算法(table_order_inline)完全一致,確保它們路由到同一物理庫的同一索引位置(如 order_id=100 時,均路由到 order_db_2 庫的 t_order_2 和 t_order_item_2 表)。
四、綁定表的關(guān)聯(lián)查詢驗證
配置完成后,執(zhí)行關(guān)聯(lián)查詢 SQL,驗證是否路由到同一物理庫。
示例 SQL
SELECT o.order_id, o.amount, i.item_id, i.product_name FROM t_order o JOIN t_order_item i ON o.order_id = i.order_id WHERE o.order_id = 100; -- 包含分片鍵條件
路由邏輯
- ShardingSphere 解析 SQL,提取分片鍵 order_id=100。
- 根據(jù)綁定表配置,t_order 和 t_order_item 均按 order_id % 4 路由:
- 庫路由:order_id % 4 = 100 % 4 = 2 → 庫名為 order_db_2。
- 表路由:order_id % 4 = 2 → 表名為 t_order_2 和 t_order_item_2。
- 最終在 order_db_2 庫中執(zhí)行本地關(guān)聯(lián)查詢(t_order_2 和 t_order_item_2),無需跨庫。
五、綁定表 vs 全局表
| 特性 | 綁定表 | 全局表 |
|---|---|---|
| 數(shù)據(jù)存儲 | 分片存儲(每個庫僅存部分數(shù)據(jù)) | 全量存儲(每個庫存完整數(shù)據(jù)) |
| 適用場景 | 大表關(guān)聯(lián)(如訂單與訂單項) | 小表關(guān)聯(lián)(如用戶字典、配置表) |
| 存儲冗余 | 無冗余 | 高冗余(所有庫存儲全量數(shù)據(jù)) |
| 路由規(guī)則 | 分片鍵和算法一致,路由到同一庫 | 無需分片,所有庫均有數(shù)據(jù) |
六、注意事項
- 分片鍵與算法必須一致:綁定表的分片鍵(如 order_id)和分片算法(庫/表策略)必須完全相同,否則無法路由到同一庫。
- SQL 需包含分片鍵:關(guān)聯(lián)查詢的 WHERE 條件必須包含分片鍵(如 order_id),否則 ShardingSphere 無法確定路由目標,可能觸發(fā)全庫掃描。
- 多表綁定:支持多個表綁定(如 t_order、t_order_item、t_order_log 均綁定),但需確保所有表的分片規(guī)則一致。
- 結(jié)果合并:ShardingSphere 會自動合并跨庫結(jié)果,但復雜關(guān)聯(lián)(如多表排序、分頁)需測試驗證性能。
總結(jié)
綁定表是 ShardingSphere-JDBC 解決跨庫表關(guān)聯(lián)查詢的核心機制,通過強制分片鍵和算法一致的表路由到同一物理庫,實現(xiàn)高效本地關(guān)聯(lián)。適用于大表之間的關(guān)聯(lián)場景(如主子表),避免了全局表的存儲冗余,同時提升了查詢性能。配置時需確保分片規(guī)則一致,并在 SQL 中包含分片鍵條件。
到此這篇關(guān)于Java中sharding-jdbc 綁定表的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java中sharding-jdbc 綁定表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實現(xiàn)分庫分表功能
- 利用Sharding-Jdbc組件實現(xiàn)分表
- SpringBoot 2.0 整合sharding-jdbc中間件實現(xiàn)數(shù)據(jù)分庫分表
- SpringBoot集成Sharding-JDBC實現(xiàn)分庫分表方式
- SpringBoot整合sharding-jdbc實現(xiàn)自定義分庫分表的實踐
- sharding-jdbc5.0.0實現(xiàn)分表實踐
- Java使用Sharding-JDBC分庫分表進行操作
- 使用sharding-jdbc實現(xiàn)水平分庫+水平分表的示例代碼
- Sharding-Jdbc 自定義復合分片的實現(xiàn)(分庫分表)
- 利用Sharding-Jdbc進行分庫分表的操作代碼
相關(guān)文章
Java AQS(AbstractQueuedSynchronizer)源碼解析
AbstractQueuedSynchronizer被稱為隊列同步器,簡稱為大家熟知的AQS,這個類可以稱作concurrent包的基礎(chǔ)。本文將通過剖析源碼來看看AQS是如何工作的,感興趣的可以了解一下2023-02-02
基于Spring Security實現(xiàn)RBAC權(quán)限控制的完整步驟
文章主要講述了基于角色的訪問控制(RBAC)的基本概念、SpringSecurity的核心功能,以及實現(xiàn)RBAC的詳細步驟,包括定義用戶模型和角色、密碼加密、JWT工具類、讓SpringSecurity認識用戶的用戶模型、JWT認證過濾器以及安全配置規(guī)則等,需要的朋友可以參考下2026-04-04
使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法
這篇文章主要介紹了使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

