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

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

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

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

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

17930 次点击
所在节点    程序员
206 条回复
zhuichen
2021-09-03 18:30:19 +08:00
主要是看你们部门 leader 怎么看这个问题,如果 care 的话,你就可以提出来,就有机会发展,不过这么久了,我估计大概率不 care,久而久之就这样了
adoal
2021-09-03 21:48:47 +08:00
这就是所谓的“互联网公司”
pcmgr456
2021-09-03 23:03:47 +08:00
@l00t 中枪了😂
lanlanye
2021-09-04 00:04:31 +08:00
看完两页希望有人来解个惑:为什么说数据量大的场景下联表会有坑?有的话常用的解决方式是什么?
wellsc
2021-09-04 00:11:51 +08:00
报我身份证得了
wqtacc
2021-09-04 00:12:24 +08:00
wellsc
2021-09-04 00:13:12 +08:00
啊不对 我对“天在想着怎么优化语言性能,比如反射、JSON 序列化、语言基础库的性能;要么就是上集群、加缓存,然后又没有任何设计模式” 也是很方案,后端还是操作系统更重要的,而不是编译原理
dcoder
2021-09-04 08:07:12 +08:00
@wellsc 就是被楼主 @wh469012917 吐槽的同事么?
vishun
2021-09-04 08:33:10 +08:00
@l00t
先在考试成绩表中查找分数大于 80 的按用户分组的个数,然后再和科目总个数比较?
```
select user_id from (
select count(*) as num,user_id from 成绩表 where score >80 group by user_id
) as t
where t.num = (select count(*) from 科目表)
```
xuanbg
2021-09-04 10:06:35 +08:00
@l00t 这貌似和科目表没啥关系啊。。。

select s.name from score a
join student b on b.id = a. student_id
group by a.student_id
having min(a.score) > 80;
cnbattle
2021-09-04 10:33:10 +08:00
想知道 lz 理解的基础的 SQL 包含哪些? 我目前基本不用子查询 jion 以及视图 存储过程啥的
crazycarry
2021-09-04 10:51:34 +08:00
你接触的太少,c 端基本就是查询 es 或者 redis 的数据了
xingheng
2021-09-04 10:57:51 +08:00
@Actrace #100 什么坑? 用不好是人和流程的问题。
fengpan567
2021-09-04 11:09:37 +08:00
@xuanbg 是不是得把 name 加到 group by 里额
wellsc
2021-09-04 11:29:23 +08:00
@dcoder
JasonLaw
2021-09-04 12:00:03 +08:00
@l00t #117 可以的话,把表结构发出来一下
snw
2021-09-04 12:03:47 +08:00
@xuanbg
*所有科目*成绩在 80 分以上
wh469012917
2021-09-04 12:09:06 +08:00
@zhuichen 部门领导自己没写代码,之前我有委婉提出过这个问题,领导意思就是说要改,但是他也没去推动这件事,我大概就知道他意思了
wh469012917
2021-09-04 12:13:35 +08:00
@cnbattle 我理解的基础,就是要懂得怎么避免 n+1 的问题,以及在合适的场景下用 join 查询,以及 where in 查询。这里“合适的场景”的定义是:通过主键的集合查询列表,可以使用 where in 来,而不是遍历集合一条条 where id =?这样
wh469012917
2021-09-04 12:14:38 +08:00
@crazycarry 如果数据量不大百万级别,并发量也不大,加 es 或者 redis 的意义在哪里?

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

https://tanronggui.xyz/t/799533

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

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

© 2021 V2EX