想在业务端维护 inner join 应该用什么算法?

2023-03-14 15:32:54 +08:00
 LeeReamond

数据库做连表压力有点大了,想要转到业务上维护,想问下版本答案用啥算法,没啥这方面的经验

场景是有 a 表数据和 b 表数据,两表用相同的主键索引,数据库方式的话应该是 a 做 b 的外键,但是现在没有这方面约束,a 和 b 的数据可能互相不一致,有的条目多一些有的条目少一些,想得到一个一致的结果,如果按直觉写多次遍历取交集这类的感觉复杂度有点高了。。。

2515 次点击
所在节点    程序员
40 条回复
aw2350
2023-03-14 15:41:15 +08:00
没明白表述
ljrdxs
2023-03-14 16:39:36 +08:00
第一反应是 LINQ 的 join 。
不过,作为用 Oracle 的人,不懂“数据库做连表压力有点大了,想要转到业务上维护”是怎么回事。你自己取两个表,放内存操作,性能胜过数据库 join ?
LeeReamond
2023-03-14 16:47:49 +08:00
@ljrdxs 说性能好肯定没把握,但是毕竟数据端扩展起来远不如业务端省事,业务节点想开多少开多少不是,然后在此基础上 join 逻辑好好写一写,相当于把数据层的 join 逻辑拆成 kv 索引了,整体压力应该能小不少吧。
shyangs
2023-03-14 17:09:15 +08:00
如果是 Python 寫的的業務層, 我是不信你能在性能和速度方面贏過 C / C++ 寫的 Oracle 、Microsoft SQL Server 、MySQL.
shyangs
2023-03-14 17:18:16 +08:00
阿里巴巴用的是 Java 只比 C 慢一倍,可以堆 2 倍伺服器。換 Python 比 C 慢 10 倍,人家堆 2 台主機,你要堆 20 台,我想在經濟下行段,老闆應該不會這麼揮金如土。

hhjswf
2023-03-14 17:30:44 +08:00
@aw2350 #1 就是自己写代码做表连接
pengtdyd
2023-03-14 17:32:43 +08:00
用冗余换时间(用空间换时间)
ljrdxs
2023-03-14 17:51:09 +08:00
@LeeReamond
“但是毕竟数据端扩展起来远不如业务端省事,业务节点想开多少开多少不是”
没懂。指数据太多了,塞爆表了?业务节点指什么?
MoYi123
2023-03-14 18:18:42 +08:00
一般 A join B 可以拆成。select A, select B where id in (....); 然后用个哈希表去组合.
看你的描述是数据库设计的不好, 为什么不直接把数据库改好呢?
MindMindMax
2023-03-14 18:31:41 +08:00
@shyangs 人家也没说用 Python 啊,你这是 PY 黑子吗
lolizeppelin
2023-03-14 18:41:52 +08:00
换数据库,mysql join 不行
结束
shyangs
2023-03-14 20:28:12 +08:00
@MindMindMax

他前幾天在 Python 版塊發帖問了兩個問題。
roundgis
2023-03-14 20:31:19 +08:00
有多大的資料 以至於 inner join 出了問題

十億那種?
LeeReamond
2023-03-14 20:41:18 +08:00
@shyangs 性能比较可以参考 Programming-Language-Benchmarks-Visualization 比你这个更清楚一些,另外为什么曾经在 py 区发过贴,连算法问题里都要有人来踩两句 py 的性能问题我也是不懂了,什么逻辑?你来发点有营养的也就算了还发的都是这种。。谁不知道 python 性能低,我们这个业务不是 python 做的
LeeReamond
2023-03-14 20:43:51 +08:00
@roundgis 总数据量不到 10 亿,单表现在大概五百万左右,我对 join 性能没有不满但是我们需要能负载高 qps ,把数据库从 join 转化为 kv 会好很多。
shyangs
2023-03-14 21:03:13 +08:00
@LeeReamond

可行性評估,難道沒營養。你先說你用什麼語言,資料不足得不到有用的回答,訓練過 ChatGPT 都知道。
iseki
2023-03-14 21:11:41 +08:00
只能说你肯定不是单纯将数据库 join 变成自己的实现,否则比数据库的实现还慢几乎是板上钉钉的(如若不然那就说明数据库该换了,斜眼 MySQL
iseki
2023-03-14 21:12:48 +08:00
如果你只是想挑战下自己,那就去参考数据库的实现吧,它用什么你就用什么
iseki
2023-03-14 21:15:13 +08:00
@MoYi123 这样的做法,除非存在比如缓存(节省掉第二个查询)之类的优化,否则自己实作不太可能比数据库快,甚至说挖坑写出 bug 是大概率的
gtx990
2023-03-14 21:16:58 +08:00
大部分的 oltp 业务就是一行 join 一行,或者一行 join 几行,走索引,你在业务做或者用 sql 做差不太多,大概率达不到你想要的效果。

除非你的需求很特殊,是几十行 join 几十行。可以考虑用自动扩容的 KV NoSQL ,DynamoDB Cassandra 这种,业务层 join 。

如果是全量 join 就上 olap 数据库没啥说的

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

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

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

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

© 2021 V2EX