给定一个简单的实体,例如User
,其中每个用户都有一个对应的user_id
,在给定user_ids
列表的情况下,获取所有用户的最佳方式是什么。
对于一个足够小的列表(可能在100个元素下),我可以做类似的事情:
SELECT * FROM users WHERE user_id IN (...);
从我正在使用的任何语言/框架生成查询。但是,当这个名单真的很大时会发生什么?另外,理想情况下我应该考虑足够小的列表?对于很长的列表,我可能会做一些事情(例如Java8中的例子):
List<CompletableFuture<List<User>> usersFuture =
ListUtils.partition(userIds, 100)
.map(x -> CompletableFuture.supplyAsync(() ->
db.fetchUserFromIds(x);
))
.collect(Collectors.toList());
List<User> users =
CompletableFuture.allOf(SomeUtils.toArray(usersFuture)).thenRun(x ->
usersFuture.stream().flatMap(List::stream).collect(Collectors.toList())
).get();
这种方法的唯一优点是它是并行化的,并且将运行最多size/100
个并行计算(或者更小,取决于池大小)。但是,以上是一个简单的例子。生产就绪代码将要求它处理错误,恢复,可能的子列表重试等。
为实现上述目标,您会推荐哪些其他方式?
答案 0 :(得分:0)
我个人更喜欢使用sql执行计划程序来决定编写查询的最佳方法。喜欢:
SELECT * FROM users WHERE user_id IN (...);
对于上面的查询,它将使用SEEK
执行计划(主要是),这在少量记录的情况下是最好的,但是当涉及大量记录时,它将给出性能噩梦。
SELECT * FROM users u
inner join [table1] t1 ON u.user_id = t1.user_id ;
这可能会为大量的记录提供SCAN
执行计划,这比SEEK
更快。
答案 1 :(得分:0)
我会将所有匹配的userid插入到一个临时表中,该表在提交时解散,然后加入临时表和users表