我们公司不让开发使用 join 包括 left join,不让用子查询,合理吗?

2020-06-03 16:47:10 +08:00
 hackingwu

我们公司规范不让开发使用 join 包括 left join,也不让用子查询,原因是为了减轻 DB 的压力,这样就导致我们一个多表联合查询的业务就要拆分多条语句,导致无效的请求和数据传输。我们业务是微服务架构。 我觉得是很不合理的。减轻了 DB parse 的压力,却带来了处理请求和数据传输的压力。 大家觉得呢?是我错了吗?

33854 次点击
所在节点    程序员
231 条回复
magicnian
2020-06-04 11:16:53 +08:00
@dawniii 这么跟你说吧,你可以用关系型数据库去存小字段数据,大字段数据推荐放 nosql 中,比如 mongodb 。只是拿 nosql 作为存储工具。当然,现在像 mysql 已经非常给力了,8.0 版本后性能有了质的飞跃,你数据量小,用 mysql 随便怎么玩都行
magicnian
2020-06-04 11:20:19 +08:00
@dawniii 我指的数据量小是在几十亿量级的,用 mysql 抗的住,即使不用分库分表,前提是对表设计要求非常严格,比说楼主提的,绝不允许 join 查询
zarte
2020-06-04 11:21:31 +08:00
不用 join 导致的问题就是不符合数据库三范式。大表 join 确实查询会很慢(仅用过 mysql ),用程序来处理数据库压力是减轻了,是否有测过处理时 web 服务器的消耗。不 join 的前提是原本多张表的数据放同一张,程序也不需要查多张再处理。
troywinter
2020-06-04 11:22:41 +08:00
微服务架构本来就不应该去关联不属于你的服务的表,应该用接口的方式去通信,禁止 join 的做法没有错,前天刚看到我司四个 join 的语句,explain 出来连续四五个 nested loop,如果你能为你写的 join 语句担责,愿意赔钱,那没问题,不然就老老实实遵守公司的规则。如果你觉得你司的数据量就这么小,以后也涨不了多少,那你大可以跟你老板去说,辞职吧。
magicnian
2020-06-04 11:26:30 +08:00
@encro 我觉得重点不是 sql 不敢用这个问题,是很多开发其实用不好复杂的 sql,而且当你的业务数据达到几十亿,上百亿后,很难在 sql 上去做优化,目前就 mysql 而言,只有分库分表一条路。但是分库分表带来的成本是很高的,如果项目初期就野蛮放纵,让开发瞎写 sql,当你想做分库分表的时候就知道有多痛苦了。所以基本上,都会有类似楼主公司的一些限制,为的就是后面数据量级上来好做优化
huijiewei
2020-06-04 11:30:01 +08:00
@dawniii 你这个简单的不能再简单了。小系统的归类统计不值得上专门的统计系统,用用 JOIN 也就罢了,你这种简单的 3 连有什么必要用 JOIN ? 分拆成 3 个 SQL 不就完事了
dawniii
2020-06-04 11:32:06 +08:00
@magicnian 你说的部分数据放到 mongo,如果查询字段同时有 mongo 和 mysql 的字段岂不是炸裂。我倒是觉得数据量大了,把查询的关键字段都放到 es 或者 nosql,然后用主键去 mysql 查详情就好。
cbasil
2020-06-04 11:32:38 +08:00
多表查询不建议用 join,如果查询条件分布在多表中,用视图比较好
dawniii
2020-06-04 11:34:29 +08:00
@huijiewei 不用 join 我是实现不了,请教下这个怎么拆成 3 个 sql 还能满足需求。
syyy
2020-06-04 11:56:05 +08:00
@lichao 我只是想知道,楼主这个想法是哪里来的,不是我的想法。
goodboy95
2020-06-04 11:58:42 +08:00
@huijiewei 简单的 3 连可还行,你拆分出来的 3 个 sql 不会把整张表读出来了吧,不然的话我是想不到怎么在有多表搜索条件的情况下保证分页功能正常的。
cco
2020-06-04 12:00:23 +08:00
一杆子打死的- -
goodboy95
2020-06-04 12:02:18 +08:00
@sanggao 请解释原因
goodboy95
2020-06-04 12:10:41 +08:00
说真的,不让用 join 就算了,楼上还有人说一块把事务禁掉的,这还用个 x 的 mysql ?光论存取的话 mongodb 那是真比 mysql 快。
说真的,有些情况下需求方真提个蛋疼的需求,完全可以把整个代码规范搞死。我现在做一个系统,存储人员的姓名和工号还有别的玩意,结果需求方要求可以输入员工名字 /工号的一部分(有可能是中间一部分)去搜索,这种操作别说 mysql 了,es 都是让人尽量不用的(虽然 es 的 wildcard 搜索确实比 mysql 快不少),但我能怎么办?一看人员数量,也就万把人吧,一年也不会增长 1000 个,最后也只能做了。
huijiewei
2020-06-04 12:12:53 +08:00
@dawniii
@goodboy95

你们是多小白啊,这么简单的都不会
SELECT id FROM tag WHERE name = XXX 取出 tag id,
SELECT id FROM user WHERE name = XXX 取出 user id

SELECT * FROM article WHERE tag_id IN(tag_ids)
SELECT * FROM article WHERE user_id IN(user_ids)

有什么难点?你告诉我
pkwenda
2020-06-04 12:29:28 +08:00
对业务自信,这样做完全没得问题,开发也很清晰,维护别人代码也容易,另外阿里开发手册是不是也不推荐用任何 join ? 反正我们已经很久不用了
nnnToTnnn
2020-06-04 12:33:03 +08:00
@nnd #25L 我猜楼主的技术架构中间层来进行扩展,数据库只是作为存储,不处理任何逻辑,将逻辑放在中间层,很方便跨库查询,分表分库? 估计有一套自己的事务控制,和自己的缓存控制。 所以才禁止使用 join 。
dawniii
2020-06-04 12:34:57 +08:00
@huijiewei 你的 article 表可以 in 查询 tag_id? 这么神奇的吗?手动狗头
nnnToTnnn
2020-06-04 12:36:20 +08:00
如果用了 join 对缓存的命中这一块,以及分库分表这一块非常难处理。 不用 join 是对缓存命中,和分库分表的妥协。
mscb
2020-06-04 12:39:52 +08:00
不能只看当前,看看未来。相比于不用 join 带来的开发效率损失,业务量上去以后进行服务拆分带来的工作量才是大成本。
给未来留后路,我认为不是什么问题,甚至很明智。
但如果这个业务本来也不是那种今后业务会很大的项目,比如某某内部管理系统,那有这个规定,纯属有问题

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

https://ex.noerr.eu.org/t/678312

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

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

© 2021 V2EX