mysql 是三张表连接查询还是分开 2+1 然后在处理合并数据?

2019-06-06 17:09:21 +08:00
 mushishi

不知道给位是怎么处理的?能否给一些建议?主表是 45W 左右的数据,从表大概 8W 左右。

3475 次点击
所在节点    程序员
20 条回复
moodasmood
2019-06-06 17:43:17 +08:00
这么点数据,瞎 jb 操作都合理
moodasmood
2019-06-06 17:44:30 +08:00
最好业务层处理,查询 3 次,数据库层面不做任何拼表
securityCoding
2019-06-06 17:51:18 +08:00
做好索引 , 数据量不大的话单表 /连表都行的.

推荐 2 楼的做法
des
2019-06-06 17:52:09 +08:00
看情况吧,分开了好缓存
Tianao
2019-06-06 20:49:31 +08:00
#2 +1,不要在数据库层面搞骚操作,交给业务逻辑去做。
akira
2019-06-06 20:52:42 +08:00
a 连 b 连 c 的话 ,真不建议,一堆人搞不定的,
还不如按 2l 拆开来写
DreamSpace
2019-06-06 21:02:10 +08:00
@moodasmood #2 为什么要查 3 次呢?查 3 次感觉会比一次拉出来慢很多,还要消耗额外的连接数,组装数据时还会有内存和性能上的开销。
Leammin
2019-06-06 21:23:47 +08:00
@DreamSpace 一次查询的话其实就是把应用层的性能开销转移到了数据库层,但数据库层的资源非常宝贵,所以一般都在应用层处理。
Lighfer
2019-06-06 21:36:30 +08:00
@DreamSpace 数据库的可扩展性比上层应用差得多,因此资源也就要珍贵得多,上层应用开销大点问题不大,内存不够了,cpu 不够了,加机器就是了,相比较而言数据库就没那么简单了
leon0903
2019-06-06 21:44:58 +08:00
其实我也有一个疑问 都说在业务层自己拆开按照单表去查,但是这样的话如果有分页呢?还有就是假如第一次从 A 表中查出来有 100w 条数据,然后要把这 100w 条数据当作条件放到 B 表中去查询,这样的话生成的 sql(如 where id in(.........................................) )难道不会超出 mysql 限制吗(我知道 mysql 这个参数可以调整,但是这终究是一次很大的网络消耗,而且容易失败)?
7654
2019-06-06 21:53:09 +08:00
@akira #6 真的有这么惨的吗。。。。
内部有个 sql plus 执行的简单报表,定时执行,经常手撸 SQL,连接时间设置的越来越长,已经 600 秒了
razertory
2019-06-06 22:12:17 +08:00
三表 join,索引做好了没有问题的
sonyxperia
2019-06-06 22:49:47 +08:00
是不是问问你们的 DBA 啊
liprais
2019-06-06 23:00:52 +08:00
很少有人自己手写能比数据库跑的快的
mysql 除外,他的 join 本身就很烂
jiezhi
2019-06-06 23:07:34 +08:00
联表查过二十多张表……

四百多行的 SQL 语句😂,不过我是搞数据的
version
2019-06-06 23:13:53 +08:00
如果是 api 接口的一般拆 3 个 sql 再 redis 缓存
如果是数据统计.看业务吧.有些过滤可以是 redis 存 id 或者其它方式来过滤.再 sql.都可以.
具体看业务了.没有绝对的方法..为了性能还是为了好修改好写代码
msg7086
2019-06-06 23:18:03 +08:00
@DreamSpace 想一想数据库的扩展性和应用程序服务器的扩展性。
数据库做一个集群代价很高,但是应用程序服务器你随便搞个几千台都不是问题。

@leon0903 你什么查询需要在 B 里查 100 万条记录?
如果真的有那么大的数据量过滤,放到 MySQL 内部做也不会更快。
akira
2019-06-07 15:10:42 +08:00
@7654 报表性质不一样,24 小时能跑出来就行
armysky
2019-06-07 21:20:10 +08:00
如果表之间的关联是能命中索引,当然是写表关联了
mushishi
2019-06-12 15:32:17 +08:00
还是觉得两张表 join,再处理数据好一点。

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

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

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

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

© 2021 V2EX