Prompts-MCP 686 skills · ai / design / design-pattern / framework / fundamentals / habit / lang / tech-selection /mcp/sse
framework framework/sharding-sphere/broadcast-binding-table.md high

sharding-sphere-broadcast-binding-table

ShardingSphere 广播表与绑定表 — 广播表(字典/配置)全库同份避免跨片 join,绑定表(主从表同分片键)让 JOIN 落同片避免笛卡尔积全片乘积。Use when 配广播表绑定表 / 分片表 JOIN 数据翻倍或变慢 / 评审关联表分片时。

广播表绑定表笛卡尔积分片 joinbindingtablesbroadcasttables
paths
  • *.java
  • *.yml

ShardingSphere · 广播表与绑定表

本条只管「哪类表配广播/绑定来避免坏 JOIN」。彻底做不了的跨库 JOIN 见 distributed-limitations.md

两种特殊表

类型 是什么 解决的问题
广播表 数据量小、各分库各存一份全量(字典、地区、配置表) 与任何分片表 join 都在本库完成,无需跨片
绑定表 一组分片键相同、分片规则一致的主从表(t_order + t_order_item 同 user_id 的主从行落同一片,JOIN 只在片内一对一

笛卡尔积问题

分片表之间若未声明绑定,中间件不知道它们同片,会把每个 t_order 分片 × 每个 t_order_item 分片做全片两两 join(笛卡尔积),结果行数翻倍且大量重复。声明 bindingTables 后只 join 对应分片,结果正确且快。

正例

# ✅ 广播表 + 绑定表
rules:
  - !SHARDING
    broadcastTables: [t_dict, t_region]        # 字典/地区表全库各一份
    bindingTables:
      - t_order,t_order_item                   # 主从表声明绑定 → 同片 join
    tables:
      t_order:      { actualDataNodes: ds_${0..1}.t_order_${0..1}, ... }
      t_order_item: { actualDataNodes: ds_${0..1}.t_order_item_${0..1}, ... }
-- ✅ 绑定表 JOIN:t_order 与 t_order_item 按 user_id 同片,片内一对一
SELECT o.*, i.* FROM t_order o
JOIN t_order_item i ON o.order_id = i.order_id
WHERE o.user_id = 1001;

反例

# ❌ t_order 与 t_order_item 都分片但没进 bindingTables
#    JOIN 时变成 2×2=4 个分片两两笛卡尔积,行数翻倍 + 结果错
rules:
  - !SHARDING
    tables: { t_order: {...}, t_order_item: {...} }   # 缺 bindingTables

理由:未绑定的分片表,中间件按「任意片可能匹配任意片」展开成笛卡尔积;同分片键的主从表声明绑定后才会只 join 同片,结果既对又快。字典类小表则用广播表,省掉跨片 join。

自检

  • [ ] 字典/配置/地区这类小表配成 broadcastTables,不参与分片 join?
  • [ ] 同分片键的主从表(订单/明细)声明进 bindingTables
  • [ ] 绑定表的分片键、分片规则、分片数完全一致(否则绑定无效)?
  • [ ] JOIN 结果没出现行数翻倍/重复(笛卡尔积征兆)?

相关