V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
djs19920210
V2EX  ›  程序员

Java 遍历 list<map> 实现 left join 快,还是 MySQL left join 速度快

  •  
  •   djs19920210 · 2021-12-16 18:23:37 +08:00 · 3559 次点击
    这是一个创建于 852 天前的主题,其中的信息可能已经有所发展或是发生改变。
    从 mysql 数据库中读出 a,b 表,得到两个 list<bean> listA,listB,对这两个 list 做遍历实现 left join,
    还是直接 sql 语句 left join 从 mysql 中查询等到结果集,
    在表数据很大的情况下,这里两种方式,哪种快
    25 条回复    2021-12-17 18:23:10 +08:00
    oxromantic
        1
    oxromantic  
       2021-12-16 18:26:37 +08:00
    数据很大的话,显然不适合读到 list 里啊
    assiadamo
        2
    assiadamo  
       2021-12-16 18:27:36 +08:00
    表很大的情况下忽略网络因素应该是数据库快,如果自己做还要关注数据占用内存过多导致 GC 问题
    数据量小的情况下 jooq 有专门的库做这个
    HiShan
        3
    HiShan  
       2021-12-16 18:29:31 +08:00
    数据库更快,数据量很大的情况,把数据从磁盘上加载到内存中考虑到磁盘 IO ,网络传输,还不如在数据库就把数据聚合好再传输
    RangerWolf
        4
    RangerWolf  
       2021-12-16 18:30:53 +08:00
    我感觉哪个都不快。。。。 有科学计算库才快~
    比如 python 的 pandas 实测比 MySQL join 快 (只要内存扛得住)
    https://www.flyml.net/2019/03/25/pandas 一个 pandas-vs-mysql-sql-的性能对比 /
    以前的一个测试文章

    很久没有用 JAVA ,提供一个参考思路,希望有帮助
    ilylx2008
        5
    ilylx2008  
       2021-12-16 18:31:32 +08:00
    也得看情况,大部分情况,用 in(id)比 left join 好
    RangerWolf
        6
    RangerWolf  
       2021-12-16 18:31:34 +08:00
    tmtstudio
        7
    tmtstudio  
       2021-12-16 18:35:07 +08:00
    用 redis 啊
    rekulas
        8
    rekulas  
       2021-12-16 18:36:27 +08:00
    严格来说没有正确答案,无论数据量大小多少,取决于你的数据结构,索引、磁盘、网络等情况,都可能出现不一致的结果。
    例如:按楼上朋友的看法反例,数据量少可能 java 快,但实际生产中本来很快的查询因为 join 一个不合理的数据集导致速度骤降的现象并不少见(即使结果数据不大),这种情况把数据分别读出来处理反而更快

    但设计合理的情况下,又可能 join 更快

    所以没有标准答案
    littlewing
        9
    littlewing  
       2021-12-16 18:41:13 +08:00
    优先 MySQL
    bk201
        10
    bk201  
       2021-12-16 18:43:34 +08:00
    那你要列出 2 种方式的时间线对比了。io 是最花时间的,所以要比较 get a ,b 全数据和 get a ,b join 结果数据的时间花费。
    chihiro2014
        11
    chihiro2014  
       2021-12-16 18:54:39 +08:00
    =。=如果是 java ,你放到内存中处理,那你的内存不够,不是得炸?
    liprais
        12
    liprais  
       2021-12-16 18:57:37 +08:00 via iPhone
    一般你怎么优化也优化不过数据库,mysql 除外
    Jooooooooo
        13
    Jooooooooo  
       2021-12-16 19:24:03 +08:00
    答案是服务器资源要远比数据库资源便宜, 能用服务器算的都用服务器算.
    notejava
        14
    notejava  
       2021-12-16 19:37:52 +08:00
    现实需求中,left join 后可能还需要各种过滤、排序,用 java 处理就很恶心了。我一般是直接 sql left join ,只要索引合理,不会慢。如果数据量实在太大,还可以分表。
    uselessVisitor
        15
    uselessVisitor  
       2021-12-16 22:25:23 +08:00
    数据库快
    CEBBCAT
        16
    CEBBCAT  
       2021-12-16 23:12:02 +08:00
    我发这一层只是想提示,不能换用数据仓库吗?就让他慢慢跑着去呗
    night98
        17
    night98  
       2021-12-16 23:36:16 +08:00
    表数据大是多大?如果超百万行且频繁使用的话肯定读内存快,缺点是内存得巨巨巨巨大,不是频繁读且项目读写性能要求不高的情况下走 mysql 肯定划算点
    akira
        18
    akira  
       2021-12-17 00:47:32 +08:00
    大部分情况下应该是 mysql 快
    xuanbg
        19
    xuanbg  
       2021-12-17 03:36:55 +08:00
    看最终结果集大小。如果结果集很小,绝对数据库快。结果集很大,数据库就没有优势了。
    teem
        20
    teem  
       2021-12-17 09:55:01 +08:00
    正常逻辑肯定是数据库直接搞定。
    unco020511
        21
    unco020511  
       2021-12-17 10:08:00 +08:00
    肯定是数据库啊
    dqzcwxb
        22
    dqzcwxb  
       2021-12-17 10:27:00 +08:00
    用 hashMap 做数据拼接解决双重循环的笛卡尔积
    liaojl
        23
    liaojl  
       2021-12-17 12:17:45 +08:00 via iPhone
    在表结构、索引设计合理的情况下,你 Java 里怎么遍历都干不过 db ,毕竟 db 是专门干这个的。表数据很大的情况下,Java 里遍历还要考虑内存和 CPU 负载的问题。
    Nich0la5
        24
    Nich0la5  
       2021-12-17 14:36:51 +08:00
    一般数据库快,能在数据库过滤的尽量在数据库层面操作,而且读那么大个 list 不怕 oom 吗
    msg7086
        25
    msg7086  
       2021-12-17 18:23:10 +08:00
    看具体情况。
    如果你访问量很大,单台 DB 压力大,那么把一部分压力转嫁到 app server 是一种可行的方案。
    但是如果你 DB 压力不那么大,表连接当然速度更快。
    (另外有一个常见的做法是先查出表外键然后再在第二张表上做 IN()拿到过滤数据,再合并结果。)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   944 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:56 · PVG 04:56 · LAX 13:56 · JFK 16:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.