V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shadow1949
V2EX  ›  数据库

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

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

    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   ·   实用小工具   ·   2766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:47 · PVG 16:47 · LAX 00:47 · JFK 03:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.