批量查询,例如 List<User>的 name 和 age,去 DB 中查询出 List<People>,怎么处理这个? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shadow1949
V2EX    数据库

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

  •  
  •   shadow1949 2021-11-18 20:18:49 +08:00 2251 次点击
    这是一个创建于 1497 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    数据量会比较大,而且如果再多个条件,例如 name,age,country ,还得再过滤。
    zgc27wo
        15
    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
        16
    br00k  
       2021-11-19 15:30:18 +08:00
    MongoDB 可以把 name 和 age 冗余到 People 表就好了。如果只是分页用,把 userId 冗余到 People 批量查回来组装一下。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5665 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 03:00 PVG 11:00 LAX 19:00 JFK 22:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86