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

2021-12-16 18:23:37 +08:00
 djs19920210
从 mysql 数据库中读出 a,b 表,得到两个 list<bean> listA,listB,对这两个 list 做遍历实现 left join,
还是直接 sql 语句 left join 从 mysql 中查询等到结果集,
在表数据很大的情况下,这里两种方式,哪种快
3742 次点击
所在节点    程序员
25 条回复
oxromantic
2021-12-16 18:26:37 +08:00
数据很大的话,显然不适合读到 list 里啊
assiadamo
2021-12-16 18:27:36 +08:00
表很大的情况下忽略网络因素应该是数据库快,如果自己做还要关注数据占用内存过多导致 GC 问题
数据量小的情况下 jooq 有专门的库做这个
HiShan
2021-12-16 18:29:31 +08:00
数据库更快,数据量很大的情况,把数据从磁盘上加载到内存中考虑到磁盘 IO ,网络传输,还不如在数据库就把数据聚合好再传输
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
2021-12-16 18:31:32 +08:00
也得看情况,大部分情况,用 in(id)比 left join 好
RangerWolf
2021-12-16 18:31:34 +08:00
tmtstudio
2021-12-16 18:35:07 +08:00
用 redis 啊
rekulas
2021-12-16 18:36:27 +08:00
严格来说没有正确答案,无论数据量大小多少,取决于你的数据结构,索引、磁盘、网络等情况,都可能出现不一致的结果。
例如:按楼上朋友的看法反例,数据量少可能 java 快,但实际生产中本来很快的查询因为 join 一个不合理的数据集导致速度骤降的现象并不少见(即使结果数据不大),这种情况把数据分别读出来处理反而更快

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

所以没有标准答案
littlewing
2021-12-16 18:41:13 +08:00
优先 MySQL
bk201
2021-12-16 18:43:34 +08:00
那你要列出 2 种方式的时间线对比了。io 是最花时间的,所以要比较 get a ,b 全数据和 get a ,b join 结果数据的时间花费。
chihiro2014
2021-12-16 18:54:39 +08:00
=。=如果是 java ,你放到内存中处理,那你的内存不够,不是得炸?
liprais
2021-12-16 18:57:37 +08:00
一般你怎么优化也优化不过数据库,mysql 除外
Jooooooooo
2021-12-16 19:24:03 +08:00
答案是服务器资源要远比数据库资源便宜, 能用服务器算的都用服务器算.
notejava
2021-12-16 19:37:52 +08:00
现实需求中,left join 后可能还需要各种过滤、排序,用 java 处理就很恶心了。我一般是直接 sql left join ,只要索引合理,不会慢。如果数据量实在太大,还可以分表。
uselessVisitor
2021-12-16 22:25:23 +08:00
数据库快
CEBBCAT
2021-12-16 23:12:02 +08:00
我发这一层只是想提示,不能换用数据仓库吗?就让他慢慢跑着去呗
night98
2021-12-16 23:36:16 +08:00
表数据大是多大?如果超百万行且频繁使用的话肯定读内存快,缺点是内存得巨巨巨巨大,不是频繁读且项目读写性能要求不高的情况下走 mysql 肯定划算点
akira
2021-12-17 00:47:32 +08:00
大部分情况下应该是 mysql 快
xuanbg
2021-12-17 03:36:55 +08:00
看最终结果集大小。如果结果集很小,绝对数据库快。结果集很大,数据库就没有优势了。
teem
2021-12-17 09:55:01 +08:00
正常逻辑肯定是数据库直接搞定。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/822661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX