首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  程序员

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

  •  
  •   wqc466817823 · 53 天前 · 963 次点击
    这是一个创建于 53 天前的主题,其中的信息可能已经有所发展或是发生改变。
    图上不了,简单描述下
    一种是在 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
        1
    justfly   53 天前
    性能和可维护性的取舍,看你的偏向了。另外从扩展性上来说,应用横向扩展比数据库扩展容易多了,这个也要考虑。
        2
    Michaelssss   53 天前
    你不考虑场景就开始问的话。。没意义,给你两个情况

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

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


    自己手算一下就知道怎么写了
        3
    dog82   53 天前
    在中间件里装载几百万条数据并不好,我倾向 sql 写复杂,前提是队里有 dba。

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

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

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

    这种情况下,即使方案二的总耗时更高,我们也会选择方案二。
        16
    sagaxu   52 天前 via Android
    假设业务层没有 cache,第二种对 db 的消耗更大

    @akira 写个存储过程做遍历,循环的时候 sleep 一下,效果是一样的
        17
    aguesuka   52 天前 via Android
    大部分情况应该选第二种,因为多部署一个应用服务器和数据库成本是不一样的。除非第二种查询的数据大小过大,并且不方便使用缓存的情况。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2716 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 13:18 · PVG 21:18 · LAX 05:18 · JFK 08:18
    ♥ Do have faith in what you're doing.