问一个业务实现方式的疑问,关于 sql 语句写复杂,但是一条出结果和业务成循环遍历判断出结果的两种方式的消耗

2019-09-27 14:02:27 +08:00
 wqc466817823
图上不了,简单描述下
一种是在 sql 语句里面各种嵌套 查询语句,select 里 case when else,加减乘除的算数

1. 这样的 sql 语句,直接在 sql 里面取做计算,就可以一条 sql 语句出结果返回前端,
2. 另外种就是先 select 出列表,在业务层去遍历列表,再去 sql 出小的语句出结果,再返回前端
这两种写法那种消耗大,语言是 java
第一种写法给的解释说,不要怀疑 mysql 的计算能力,毕竟我们买的事 8 核 16g 内存的 mysql,反而觉得业务层去遍历 再一条条 sql 会消耗更大
2142 次点击
所在节点    程序员
17 条回复
justfly
2019-09-27 14:10:55 +08:00
性能和可维护性的取舍,看你的偏向了。另外从扩展性上来说,应用横向扩展比数据库扩展容易多了,这个也要考虑。
Michaelssss
2019-09-27 14:12:49 +08:00
你不考虑场景就开始问的话。。没意义,给你两个情况

应用服务器*20
数据库*1

一个是数据库和服务器在同一台主机下


自己手算一下就知道怎么写了
dog82
2019-09-27 14:14:47 +08:00
在中间件里装载几百万条数据并不好,我倾向 sql 写复杂,前提是队里有 dba。

我是自带 dba 光环的
wqc466817823
2019-09-27 14:20:55 +08:00
@Michaelssss 是的,我懂了,我更倾向于业务层去写判断的逻辑,但是这样的 sql 是 10 几年的老 java 写出来的,我也是看的很蛋疼
l00t
2019-09-27 14:23:47 +08:00
第二种开销大啊。你反复查询数据库都是有开销的,不要以为只是简单的 select 就没成本了。建立连接,解析语句,以及数据的传输,都有成本。
Raymon111111
2019-09-27 14:52:51 +08:00
一般来说省数据库的资源更好

业务的机器扩展比数据库的机器扩展要简单很多

换句话说, 数据库的资源更加宝贵
arrow8899
2019-09-27 15:19:28 +08:00
这样做的前提是 sql 优化得比较好。不然有可能把数据库搞死。
zdt3476
2019-09-27 15:23:47 +08:00
做个测试啊。
jjianwen68
2019-09-27 15:24:21 +08:00
感觉一旦开始用 sql 写业务逻辑,很可能 sql 就会越来越复杂,毕竟需求总是在不断变化的
newtype0092
2019-09-27 15:52:37 +08:00
先 select 出列表,业务层遍历数据,需要子查询的时候要在业务层把条件汇总好,在尽量少的额外查询里获取关联数据,在遍历里重复同样的 sql 做查询就有点蠢了。
david2011012
2019-09-27 15:54:28 +08:00
mysql 做的最主要的事,我觉得是数据持久化,用 sql 完成业务逻辑的编写,需要考虑性能问题,除非你设计的表结构支持的很好,不然还是乖乖用代码做业务层该做的事情
zarte
2019-09-27 17:33:47 +08:00
我觉得实践出真理,画点时间自己测试下,然后发结果,看下有没别人做过类似测试有不同结果的,然后找不同。
hellwys1
2019-09-27 17:53:42 +08:00
@l00t #5
估计理解成了循环中查询?
xnode
2019-09-27 18:02:33 +08:00
我觉得 理论上 sql 性能高 ,但是实际上 业务需求变动可能太频繁 我不会轻易的用 第一中
akira
2019-09-27 18:10:08 +08:00
第一种是数据库 cpu100% 一分钟。
第二种是数据库 cpu 10% 30 分钟。

这种情况下,即使方案二的总耗时更高,我们也会选择方案二。
sagaxu
2019-09-28 00:18:21 +08:00
假设业务层没有 cache,第二种对 db 的消耗更大

@akira 写个存储过程做遍历,循环的时候 sleep 一下,效果是一样的
aguesuka
2019-09-28 11:40:03 +08:00
大部分情况应该选第二种,因为多部署一个应用服务器和数据库成本是不一样的。除非第二种查询的数据大小过大,并且不方便使用缓存的情况。

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

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

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

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

© 2021 V2EX