批量查询,例如 List<User>的 name 和 age,去 DB 中查询出 List<People>,怎么处理这个?

2021-11-18 20:18:49 +08:00
 shadow1949

name 和 age 才能唯一标识 People 中的一条数据。 这种批量查询怎么实现性能比较好?代码或者 SQL 什么都可以。

1816 次点击
所在节点    数据库
16 条回复
zxlzy
2021-11-18 20:28:29 +08:00
SELECT * FROM people WHERE (name = 'a' AND age = 1) OR (name='b' AND age=2) OR ...
imshawer
2021-11-18 21:07:33 +08:00
要性能就要索引,要索引可以用复合主键。
RuLaiFo
2021-11-19 00:40:07 +08:00
加 name 和 age 组成的唯一索引
EmiliatanTenshi
2021-11-19 08:52:19 +08:00
最好的姿势是搞个 userId ,全域统一使用 userId 避免这种蛋疼的问题
lidlesseye11
2021-11-19 09:28:36 +08:00
语言我就猜是 Java 吧,用的是啥 DB 你好歹说一下啊😅
c6h6benzene
2021-11-19 10:13:21 +08:00
而且你的 User 有没有表…有的话 select from people p left join user u on p.name=u.name and p.age = u.age. 逐条的话就是 1 楼老哥的那种写法。Hibernate 之类我记得好像可以 FindByNameAndByAge ?
cyrivlclth
2021-11-19 11:06:57 +08:00
一楼的用 in 应该也能查出来
pierswu
2021-11-19 11:11:39 +08:00
mysql
SELECT * FROM people WHERE (name, age) in (('a',1),('b',2)...)
taofoo
2021-11-19 11:19:33 +08:00
感觉年龄区分度不大,如果 name 区分度比较大的话,可以直接拿名字然后代码判 age 过滤
calmzhu
2021-11-19 12:32:14 +08:00
不同数据量不同数据特征的解决方案不一样的。

盲猜数据量不爆炸,age 索引拿数据,然后代码过滤 name 试试。
shadow1949
2021-11-19 13:03:37 +08:00
@zxlzy 这样 or 查询,如果数据很多,应该会比较慢吧?
shadow1949
2021-11-19 13:03:55 +08:00
@lidlesseye11 语言是 Java ,DB 用得 MongoDB
shadow1949
2021-11-19 13:04:37 +08:00
@c6h6benzene User 是没有表的
shadow1949
2021-11-19 13:06:36 +08:00
@calmzhu
@taofoo

数据量会比较大,而且如果再多个条件,例如 name,age,country ,还得再过滤。
zgc27wo
2021-11-19 14:51:58 +08:00
要不这样?
1. 先数据库获取所有的<People> name,age,id 的组合
2. 基于 name-age 分组的[分组 A]
3. 然后匹配自己<User>的 name 和 age 获取 name-age 去[分组 A]找到对应的 Id 集合
4. 再去数据库通过 id 集合查找对应的<People>

相当于给 name,age,id 打了联合索引
br00k
2021-11-19 15:30:18 +08:00
MongoDB 可以把 name 和 age 冗余到 People 表就好了。如果只是分页用,把 userId 冗余到 People 批量查回来组装一下。

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

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

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

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

© 2021 V2EX