问一个业务实现方式的疑问,关于 sql 语句写复杂,但是一条出结果和业务成循环遍历判断出结果的两种方式的消耗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wqc466817823
V2EX    程序员

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

  •  
  •   wqc466817823
    wqcsimple 2019-09-27 14:02:27 +08:00 2588 次点击
    这是一个创建于 2209 天前的主题,其中的信息可能已经有所发展或是发生改变。
    图上不了,简单描述下
    一种是在 sql 语句里面各种嵌套 查询语句,select 里 case when else,加减乘除的算数

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

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

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


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

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

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

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

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

    @akira 写个存储过程做遍历,循环的时候 sleep 一下,效果是一样的
    aguesuka
        17
    aguesuka  
       2019-09-28 11:40:03 +08:00 via Android
    大部分情况应该选第二种,因为多部署一个应用服务器和数据库成本是不一样的。除非第二种查询的数据大小过大,并且不方便使用缓存的情况。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1078 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:04 PVG 07:04 LAX 16:04 JFK 19:04
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86