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

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

  •  
  •   djs19920210 · 191 天前 · 2687 次点击
    这是一个创建于 191 天前的主题,其中的信息可能已经有所发展或是发生改变。
    从 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  
       191 天前
    数据很大的话,显然不适合读到 list 里啊
    assiadamo
        2
    assiadamo  
       191 天前
    表很大的情况下忽略网络因素应该是数据库快,如果自己做还要关注数据占用内存过多导致 GC 问题
    数据量小的情况下 jooq 有专门的库做这个
    HiShan
        3
    HiShan  
       191 天前
    数据库更快,数据量很大的情况,把数据从磁盘上加载到内存中考虑到磁盘 IO ,网络传输,还不如在数据库就把数据聚合好再传输
    RangerWolf
        4
    RangerWolf  
       191 天前
    我感觉哪个都不快。。。。 有科学计算库才快~
    比如 python 的 pandas 实测比 MySQL join 快 (只要内存扛得住)
    https://www.flyml.net/2019/03/25/pandas 一个 pandas-vs-mysql-sql-的性能对比 /
    以前的一个测试文章

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

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

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