订单和明细按 order_id 分片,配置里漏了绑定关系,一条查 200 个订单的 SQL 返回 6400 行,前端列表重复渲染。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,两张表没声明为绑定表,中间件把 SQL 分别路由到所有片再拼接结果。A 片的订单和 B 片的明细被拼在一起,行数变成片数相乘。

「绑定表配置」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。

shardingRule:
  bindingTables:
    - t_order,t_order_item

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,在分片配置里把两张表登记为绑定表 分片键保持一致;确认两张表的分片算法和片数完全相同;用一条带 order_id 的 SQL 看路由是否只落一个片;回归时比对关联查询行数和单库结果。

最后用这个标准收尾,同一条关联 SQL 只落一个片 返回行数和单库一致。

作者 9823189