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

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

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

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

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

17919 次点击
所在节点    程序员
206 条回复
wh469012917
2021-09-03 14:17:02 +08:00
@neoblackcap 这样说其实也对,也可以把 join 拆出来,分开查询也可以,但是 n+1 以及 in 查询,这些算是基本功了
wh469012917
2021-09-03 14:21:09 +08:00
@daguaochengtang 正常,瞎说又不用有什么成本
kemistep
2021-09-03 14:21:33 +08:00
sql 写的好不好,让他们写个次日留存,第 2 日留存,第 3 日留存,就知道能力了;
jtwor
2021-09-03 14:25:35 +08:00
in 很多都是临时表查出 id 然后再用 id 去 in 查询这样就走 range 了好像比 index 还快。join 要看分库分表决策吧。确实现在很多都用 orm,直接弱化很多人的 sql 能力。
wh469012917
2021-09-03 14:27:49 +08:00
@jtwor 对,这样也确实比较建议;但是奈何不会啊,都是遍历这个 id list,然后一条条 where id = ? 这样去查询,妥妥的拉低性能
ipwx
2021-09-03 14:32:26 +08:00
@wh469012917 所以你可以问问你的同事,有没有听说过临时表 TEMPORARY TABLE,知不知道 mysql temporary table ON HEAP 是内存表很快。

----

你看,如果不知道临时表这个功能,那你除了 for loop 还有啥办法?当年我不知道临时表的时候,我为了不那么愚蠢的 for loop,最开始我是给 id 切成一个 batch 一个 batch 然后 for loop 的。为了能用 prepared statement 我还强行填满最后一个 batch 然后靠 null 来区分是不是真的有数据。。。
lithiumii
2021-09-03 14:32:28 +08:00
给他们发个只连生产数据库的 Tableau,让他们做各种统计报表,一个月下来保证个个都是随手三百行 sql 的大佬(于此同时数据库被平均时长半小时的慢查询淹没,用户没一个能在上班时间使用的
ipwx
2021-09-03 14:33:13 +08:00
@wh469012917 你别笑。当年我很在乎性能,可是不知道 temporary table 就是不知道。我都用上 batch + null 判断来“想办法优化性能了”(大概确实能优化一点吧)
wh469012917
2021-09-03 14:35:40 +08:00
@lithiumii 线上很多接口超时的,都是 sql 查询太多了
roundgis
2021-09-03 14:36:25 +08:00
n+1 要看情況,如果可以命中 cache

還好了

特別是那種 select by id 的簡單查詢
pocarisweat
2021-09-03 14:42:58 +08:00
类似 FaceBook 到今天都在大量使用自己魔改的 PHP,为什么不用 Go 重写呢?说明 FaceBook 的技术眼界已经被 Bilibili 吊打了 🐶
wh469012917
2021-09-03 14:43:03 +08:00
@roundgis 对的,如果有 cache 确实还算 ok,但是关键没有 cache 也这么搞
dcoder
2021-09-03 14:44:51 +08:00
@wh469012917 以前写 Django 时用 ORM 很多. 后来写 Go 多了, 都是直接写 SQL 了. 感觉各有个的好.
wh469012917
2021-09-03 14:48:41 +08:00
@dcoder 嗯对的,没有哪个更好,选个合适的即可
CodeCodeStudy
2021-09-03 14:49:47 +08:00
面向面试编程,现在的面试动不动就是分布式、大数据什么的,多吹一吹这些东西能拿高工资,因为面试官特别是当了管理的面试官,大多都是杂而不精,每个东西都懂一点,所以叫他们深入 SQL 优化,他们也不知道,更不知道怎么去问人,通常都是笼统地问怎么优化数据库
muzuiget
2021-09-03 14:52:35 +08:00
开讲有话:面试造航母,工作拧螺丝。
wh469012917
2021-09-03 14:53:45 +08:00
@CodeCodeStudy 话这么说,但是开发自己至少要懂吧,这些算是基本功了
sagaxu
2021-09-03 14:53:51 +08:00
我司平台架构组大佬,搭建的配 key value 置中心,key 在 db 里面是没有索引的,每次落到 db 都是全表遍历
JudyHal
2021-09-03 14:54:56 +08:00
一般只有写 Java 的人才会有这个特点
qinghou
2021-09-03 14:56:09 +08:00
统计慢查询,挂在名字上,自动就能学会优化 SQL 。

缓存队列分布式如果真能说的“头头是道”,mysql+SQL 相对来说简单很多。

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

https://tanronggui.xyz/t/799533

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

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

© 2021 V2EX