Java 遍历 list<map> 实现 left join 快,还是 MySQL left join 速度快 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
djs19920210
V2EX    程序员

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

  •  
  •   djs19920210 2021-12-16 18:23:37 +08:00 4332 次点击
    这是一个创建于 1474 天前的主题,其中的信息可能已经有所发展或是发生改变。
    从 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 ,你放到内存中处理,那你的内存不够,不是得炸?
    F281M6Dh8DXpD1g2
        12
    F281M6Dh8DXpD1g2  
       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 ,只要索引合理,不会慢。如果数据量实在太大,还可以分表。
    zm8m93Q1e5otOC69
        15
    zm8m93Q1e5otOC69  
       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     Solana     3480 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:26 PVG 12:26 LAX 20:26 JFK 23:26
    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