[求教] 阿里 Java 编程规范:避免使用 IN。 那这个业务场景不用 IN 还有什么好方案么?

2021-05-31 10:57:13 +08:00
 bubuXiaoqi

公司里面有 10W 个客户,员工 A 负责其中 2W 个客户。 (数据在用户库里面)

现在 员工 A 要查询 [自己负责的所有客户] 的实时交易明细。(数据在订单库里面,和用户库是两个实例)

目前的方案是查这 2W 的客户的 ID,然后在交易明细里面进行客户 IDS 的过滤。

但是这样 IN 的内容就特别大,而且可能还会变大。今天看到 JAVA 编程规范里面说避免使用 IN,那这样还有什么好办法么。

因为 员工看自己负责的客户的 账户、订单、交易、等业务表太多太多了。每个表目前都是 in ids 的方案。

6535 次点击
所在节点    MySQL
64 条回复
BBCCBB
2021-05-31 10:58:17 +08:00
看能不能改成 join.
bubuXiaoqi
2021-05-31 11:01:38 +08:00
@BBCCBB 因为在不同的数据库实例里面了。所以没有办法用 join
bubuXiaoqi
2021-05-31 11:02:17 +08:00
用户、订单、商品 等都是单独部署的服务器和数据库
statement
2021-05-31 11:03:09 +08:00
mysql 最大 1000 。oracle 最大 5000 如果 sql 不知道怎么写。 就分批 in
buster
2021-05-31 11:04:42 +08:00
DBLINK 这种方案呢
clf
2021-05-31 11:13:24 +08:00
试着跨数据库 join ?只要几个数据库的类型是一致的,各家都有跨服务器数据库查询的方法。

还有就是所有表都存一个负责人的 id 。
eason1874
2021-05-31 11:14:44 +08:00
可以考虑楼上说的 DBLink

但如果是我,有可能的话,我直接在订单库维护一个客户关系表,反正占不了多少空间
Jooooooooo
2021-05-31 11:15:53 +08:00
in 特别多 mysql 踩不上索引, 200 个差不多是极限了.
bubuXiaoqi
2021-05-31 11:23:43 +08:00
@lychs1998 主要数据量也非常大。 哪怕都在同一个数据库 in 太多了用不上索引速度都很慢
bubuXiaoqi
2021-05-31 11:24:58 +08:00
@lychs1998 员工和客户的关系是会变的 而且一个客户可能会被多个员工负责。。。 就是员工负责 部分标签的客户。 所以不同的员工可能都会负责同一个标签
bubuXiaoqi
2021-05-31 11:25:09 +08:00
@Jooooooooo 对 所以现在很头疼
bubuXiaoqi
2021-05-31 11:26:12 +08:00
@eason1874 这个方案还是要进行数据库的关联过滤么。 但是大表关联大表 之前没有拆之前就是关联查询的 效果好差。
bubuXiaoqi
2021-05-31 11:26:56 +08:00
@statement 分批 in 的话 不仅数据要进行汇合 。而且面对过滤分页的场景处理不了。
bubuXiaoqi
2021-05-31 11:28:36 +08:00
@buster 最早的时候所有数据库都在一起的时候。效率都挺差的 因为数据挺多的。 除非针对每个 SQL 针对性的给索引 不然大表间关联 之前用的也很慢
biuaxia
2021-05-31 11:31:46 +08:00
同问,先关注一波。有好的回复麻烦 call 一下。
@bubuXiaoqi
bubuXiaoqi
2021-05-31 11:32:36 +08:00
bubuXiaoqi
2021-05-31 11:33:37 +08:00
@Jooooooooo 有一个参数可以改 in 的内容的值。我目前改的不小。但是这个方案本身好像不长久。而且性能也不行
xwayway
2021-05-31 11:38:04 +08:00
总共 10w 客户,一个员工就 2w 了。这么厉害。2w 客户,感觉员工要忙死
dswyzx
2021-05-31 11:43:20 +08:00
ids 临时表然后 join or exists
Jooooooooo
2021-05-31 11:45:35 +08:00
@bubuXiaoqi 那个值只能算是临时解决, 改太大了也不行, 很影响性能

考虑把数据异构一下吧, 这种特殊业务逻辑单独弄个表?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/780277

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX