为什么很多人连基础的 SQL 都写不好,却开口闭口就是缓存架构分布式?

2021-09-02 18:35:48 +08:00
 wh469012917

说下情况,我们公司同个部门的好几个同事,连个基础的 SQL 都写不好,代码中一堆数据库 N+1 的问题,连个 WHERE IN 查询都不会用,涉及到批量查询,都是遍历然后一条条的去跑 SQL,同一个方法重复查询了好几次,数据库设计更是不行,外键都是用逗号分隔拼接成字符串,然后保存到主表上。

正因为 SQL 写的烂,所以接口性能很差劲,但是他们好像都不在意这些 IO 方面的优化,整天在想着怎么优化语言性能,比如反射、JSON 序列化、语言基础库的性能;要么就是上集群、加缓存,然后又没有任何设计模式,直接业务代码中强硬加入缓存读写,就算是缓存也是先从缓存读出数据,然后遍历一条条去数据库再查出来,性能更差了

其实整体项目量不大,好好写好 SQL,基本上能搞定 90% 的性能问题了,大部分的开发经验也都好几年了,不至于这种基础知识点不懂,可为啥就是不重视 SQL 性能

17926 次点击
所在节点    程序员
206 条回复
xinJang
2021-09-03 15:39:51 +08:00
@summerLast 试了下,空指针。
我本身 sql 是个模糊搜索的查询,里面本来就有 left join 语句,可能不适合我这种场景
Canon1014
2021-09-03 15:44:04 +08:00
还不是被逼的
qrobot
2021-09-03 15:44:06 +08:00
因为 SQL 写的再好,比如中间件的一次缓存命中, 如果缓存命中率达到 90% 以上, 那么就不存在 IO 问题。


```
正因为 SQL 写的烂,所以接口性能很差劲,但是他们好像都不在意这些 IO 方面的优化,整天在想着怎么优化语言性能,比如反射、JSON 序列化、语言基础库的性能;要么就是上集群、加缓存,然后又没有任何设计模式,直接业务代码中强硬加入缓存读写,就算是缓存也是先从缓存读出数据,然后遍历一条条去数据库再查出来,性能更差了
```

我不清楚你们的项目结构,不过 IO 在怎么优化是有瓶颈的,为了提高命中缓存, 我觉得不用 in 和 left join 是最好的
dbpe
2021-09-03 15:45:50 +08:00
@xinJang 现在我是用..jooq 或者 querydsl 去解决...不过我还是尽量单表查询,然后去合并查询请求...list 遍历去查不靠谱
Akiya
2021-09-03 15:47:07 +08:00
这个你得怪市场需求,不要怪同事,公司招什么样的人,就会得到什么样的人
cedoo22
2021-09-03 15:50:10 +08:00
技术面试到面试数据库知识的时候 分两种, 一种给个场景直接问 SQL 怎么写, 另外一种是问你数据库集群 balabala,
wh469012917
2021-09-03 15:52:06 +08:00
@qrobot 但是我们数据量并不大,并发也不高,基本上写好 sql 能处理大部分场景了,缓存架构什么的等业务起来了再搞也不迟
xinJang
2021-09-03 15:55:22 +08:00
@xinJang 不能使用自己的 sql 查询 不然就空指针 无解
followyourheart
2021-09-03 15:58:26 +08:00
@ipwx #66 你说的这种临时表 不应该是我们优化的对象 避免产生临时表吗
hhjswf
2021-09-03 16:00:23 +08:00
我们总监不让用 join 的...n+1 怎么避免..
xinJang
2021-09-03 16:07:48 +08:00
@dbpe 没看太明白。如果你是先查单表,拿到的数据是一个 list 吧,这时你不遍历查询怎么组合数据?这里还有个问题,那就是分页数据,组合之后的数据长度有时是不一致的,那就会变成翻第 2 页只有 1 条数据的可能
flybluewolf
2021-09-03 16:08:10 +08:00
@hhjswf 笑死,关系型数据库这么多年理论研究都白搞?不要 join,那还玩什么集合论?所有关系型数据库都移除 join 操作好了!具体项目具体研究,基本上 99%的项目关系型数据库足够满足要求,性能问题都能通过 sql 语句+索引解决。
flybluewolf
2021-09-03 16:11:02 +08:00
@dcoder 动则都分布式? CPA 咋解决?
followyourheart
2021-09-03 16:21:45 +08:00
@hhjswf #110 查出来 list1 然后获取 idList 根据 idList 一次性查出数据集合 Map<id,Object>,然后遍历 list 根据 id 从 Map 取出数据,组装数据,不知道有没有更好的方法
jun771480011
2021-09-03 16:29:09 +08:00
因为 SQL 写不好,所以张口闭口就是缓存架构分布式!
dream4ever
2021-09-03 16:29:31 +08:00
@wh469012917 他们这个智商,就告别这一行吧
l00t
2021-09-03 16:29:32 +08:00
@vjnjc 我们面试有一道 SQL 题,大致是这样的,有一个学生表,一个科目表,一个考试成绩表。让用一条语句找出所有科目成绩在 80 分以上的学生。

看起来很简单吧? 9 成的面试者没法写对。
skinny
2021-09-03 16:32:35 +08:00
现在这行不就流行堆砌分布式、集群、高并发、高性能、高可用等等这些看似高大上名词的风气吗?

连那些云服务大厂都一个鸟样,吹起来什么异地灾备、自动化、高可用有多少个 9,崩起来就 N 小时还全面崩
followyourheart
2021-09-03 16:40:28 +08:00
@l00t #117 查出最低分大于 80 的 group by 不就行了吗
dream4ever
2021-09-03 16:42:10 +08:00
@sagaxu 我一同事负责的一项业务有不少 SQL 查询,前一段时间发现服务器 CPU 经常飙到 100%,排查来排查去发现一堆慢查询,最后追根溯源发现数据库各个表所有被查询到的字段都没有设置索引……

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

https://tanronggui.xyz/t/799533

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

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

© 2021 V2EX