• 请不要在回答技术问题时复制粘贴 AI 生成的内容
djs19920210
V2EX  ›  程序员

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

  •  
  •   djs19920210 · Dec 16, 2021 · 5461 views
    This topic created in 1789 days ago, the information mentioned may be changed or developed.
    从 mysql 数据库中读出 a,b 表,得到两个 list<bean> listA,listB,对这两个 list 做遍历实现 left join,
    还是直接 sql 语句 left join 从 mysql 中查询等到结果集,
    在表数据很大的情况下,这里两种方式,哪种快
    25 replies  •  2021-12-17 18:23:10 +08:00
    oxromantic
    oxromantic
    Dec 16, 2021
    1
    数据很大的话,显然不适合读到 list 里啊
    badbye
    badbye
    Dec 16, 2021
    2
    表很大的情况下忽略网络因素应该是数据库快,如果自己做还要关注数据占用内存过多导致 GC 问题
    数据量小的情况下 jooq 有专门的库做这个
    HiShan
    HiShan
    Dec 16, 2021
    3
    数据库更快,数据量很大的情况,把数据从磁盘上加载到内存中考虑到磁盘 IO ,网络传输,还不如在数据库就把数据聚合好再传输
    RangerWolf
    RangerWolf
    Dec 16, 2021
    4
    我感觉哪个都不快。。。。 有科学计算库才快~
    比如 python 的 pandas 实测比 MySQL join 快 (只要内存扛得住)
    https://www.flyml.net/2019/03/25/pandas 一个 pandas-vs-mysql-sql-的性能对比 /
    以前的一个测试文章

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

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

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