报表 SQL 关联 t_order 和 t_order_item,两张表分片键不同,中间件直接抛 1105 Unknown table 't_order_item',同一条 SQL 在单库上能跑。日志里能对上时间点,这种反而好排。
中间件只把 SQL 路由到订单表所在的分片,明细表在另一套库上,那个分片没有这张表。跨片关联要把两边数据拉到同一节点,中间件默认不做。这一点先确认清楚,后面就不用反复试。
SELECT id, user_id FROM t_order WHERE create_time >= '2026-11-01'; SELECT order_id, sku_id FROM t_order_item WHERE order_id IN (?, ?, ?);
「跨分片JOIN」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。
处理上按这个顺序:先按时间范围查主表 拿到订单 id 列表;再用 id 列表去明细表所在分片查 in 查询 分两次取数;在应用层按 order_id 做 map 关联 不要拼回一条 SQL;数据量大的报表落到离线宽表。
结果对不对很好判断,报表能正常出数 明细条数和单库对账一致。
