要是不准 Join,如何解决某些需要 Join 后查询的问题?

2018-07-26 13:01:56 +08:00
 abcbuzhiming
看不少经验分享提到 Mysql 在大数据量,大并发下,尽量不要用 Join,阿里巴巴的规范里提出 3 表以上别 Join ; 58 更激进直接禁止了 Join,但是 58 有自己的索引服务可以进行检索,我就想那些没有索引服务的,怎么解决某些必须 Join 后搜索的问题,用冗余字段,且不说冗余字段有关联更新问题;你要加多少冗余字段呢,那主表不是又变大了吗,另外 1 对 1 关系加冗余字段可行,多对多关系加冗余字段是没效的啊,有没有有人有这方面的经验?
12516 次点击
所在节点    MySQL
41 条回复
lk0317
2018-07-26 13:09:51 +08:00
数据库层面不能 join,不代表你不能在应用层面做 join。
Nostalgiaaaa
2018-07-26 13:12:59 +08:00
说句无关的。你这个头像漏点了吧。。。
dany813
2018-07-26 13:13:55 +08:00
@Nostalgiaaaa 老哥好眼力
nowheretogogo
2018-07-26 13:46:09 +08:00
不仅是 MYSQL,很多都是建议不要用多于三个 join。
一般都是应用层面做类似于 join 的操作。
abcbuzhiming
2018-07-26 14:27:26 +08:00
@lk0317 给你举个例子,学生一张表,班级一张表,班级自身带有入学学年,所属学院这样的属性,我现在要根据入学学年和所属学院过滤学生,你告诉我怎么在应用层 join,要实现分页查询的
abcbuzhiming
2018-07-26 14:32:42 +08:00
@Nostalgiaaaa 没有漏点,自己去看吧
https://yande.re/post/show/9115
lihongjie0209
2018-07-26 14:33:29 +08:00
select * from 学生 where 班级 ID IN (select id from 班级 where 学年=... and 学院=...) limit ...
abcbuzhiming
2018-07-26 14:34:54 +08:00
@nowheretogogo 不带搜索条件的应用层 join 很容易做到,二次查询而已,但是只要加几个 where 条件搜索 join 的表,你要怎么办
abcbuzhiming
2018-07-26 14:35:41 +08:00
@lihongjie0209 朋友,IN 的数据比较大你怎么办,in 的数据大了效率立马降低
lihongjie0209
2018-07-26 14:39:51 +08:00
@abcbuzhiming #9 应用层 for 循环
lihongjie0209
2018-07-26 14:40:27 +08:00
@abcbuzhiming #9 话说你的班级能有多少?
saltxy
2018-07-26 14:40:56 +08:00
可以看下 CQRS 方面的东西
lk0317
2018-07-26 14:42:41 +08:00
@abcbuzhiming 没看懂,两次 select 会有什么问题?
kran
2018-07-26 14:50:57 +08:00
这个例子加冗余挺合适的😄
micean
2018-07-26 14:58:28 +08:00
你举得这个例子,我觉得不能把普通的传统软件的分页简单套用在分表分库这种情况吧
abcbuzhiming
2018-07-26 15:06:28 +08:00
@lihongjie0209 for 循环?循环什么数据?
我拿班级只是做个简单的例子,还有一种查询右表是查时间范围的,右表能有几百条记录,你用 in 摆的平吗?
abcbuzhiming
2018-07-26 15:08:09 +08:00
@lk0317 两次查询只能用在不需要 where 的场合下,我现在问你,我现在要 where 右边,而且不止一个字段,你咋办呢,像你楼下那样先查一次,然后 in 吗?可问题是 where 得到的记录非常多你咋办?
abcbuzhiming
2018-07-26 15:09:04 +08:00
@kran 一点都不合适的好吗,你见过报表系统要过滤十来个字段的吗
abcbuzhiming
2018-07-26 15:09:54 +08:00
@micean 分页是硬需求,你分表分库,你最后展现在用户面前的数据还不是得分页
kran
2018-07-26 15:16:25 +08:00
@abcbuzhiming 见过

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

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

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

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

© 2021 V2EX