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

关于复杂的多表关联查询,大家一般都是怎么处理的?

  •  
  •   misakarin · 2020-02-27 15:55:47 +08:00 · 4326 次点击
    这是一个创建于 1710 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这几种方式:
    1、将逻辑一次性通过 SQL 处理完
    2、在代码中处理,分几次请求数据库
    3、在代码中处理,数据库加冗余字段,减少请求数据库的次数

    大家一般倾向哪一种,或者有没有更好的方式
    22 条回复    2020-02-28 10:46:00 +08:00
    noreplay
        1
    noreplay  
       2020-02-27 15:59:24 +08:00
    个人倾向于第一种。
    waising
        2
    waising  
       2020-02-27 16:02:01 +08:00 via iPhone
    个人倾向于第二种,但实际情况是第一种
    zuoakang
        3
    zuoakang  
       2020-02-27 16:03:31 +08:00
    还好不是多库查询,多表多话,看执行速度吧,如果速度慢,可以考虑中间表吧
    wd
        4
    wd  
       2020-02-27 16:07:37 +08:00 via iPhone
    取决于实际情况...
    luoyou1014
        5
    luoyou1014  
       2020-02-27 16:15:31 +08:00   ❤️ 2
    没有性能压力,第一种和第二种没区别,用 3 就浪费工作量

    有性能压力,第一种绝对不能用,会直接拖垮数据库,第二种仅能使用于一种情况,就是这个语句不是经常执行的,只是偶尔执行一下,例如在后台查看一些统计数据。

    有性能压力,且查询量大,只能采用第三种办法。
    zhaorunze
        6
    zhaorunze  
       2020-02-27 16:21:29 +08:00
    4.定时任务收集数据
    leon0903
        7
    leon0903  
       2020-02-27 16:49:24 +08:00
    有分页要求的话 只能用第一种吧。
    bbbai
        8
    bbbai  
       2020-02-27 17:16:06 +08:00
    倾向第一种。数据量过大的 实时性要求不高倾向于 #6 提出的第四种
    akira
        9
    akira  
       2020-02-27 17:17:16 +08:00
    2 3
    newtype0092
        10
    newtype0092  
       2020-02-27 17:18:32 +08:00
    这几种方式都有存在的必要,没有一种方法能通吃所有场景。
    laojiaqing
        11
    laojiaqing  
       2020-02-27 17:20:48 +08:00
    定时任务就不会有性能压力?
    zhuangjia
        12
    zhuangjia  
       2020-02-27 17:22:54 +08:00
    倾向于第一种,实际第二种
    目的是方便理解和修改……
    Ministor
        13
    Ministor  
       2020-02-27 17:44:16 +08:00
    索引啊 es 之类的
    silvermuse
        14
    silvermuse  
       2020-02-27 17:45:26 +08:00   ❤️ 1
    从不用联表查询。。多数用二,请求频繁性能压力特别大的用三。
    联表查询量稍微上来一点点就不行了,性能实在太差。
    wzwwzw
        15
    wzwwzw  
       2020-02-27 17:47:30 +08:00
    不要求实时,用定时任务执行第一种,把结果存缓存。实时第二种。
    loryyang
        16
    loryyang  
       2020-02-27 19:43:28 +08:00
    看你多复杂了,太复杂,用 1 的方法有时候会很慢,需要做专门的优化。如果速度 OK 的话,1 挺好的。为了省事,就 2 好了
    另外,2 的查询还会涉及到原子性问题
    loryyang
        17
    loryyang  
       2020-02-27 19:44:30 +08:00
    不少引擎对这种联合查询场景有专门的优化,不过不是万能的,稍微复杂一些就可能无法优化,而导致速度变得很慢
    optional
        18
    optional  
       2020-02-27 19:45:44 +08:00
    没什么好争议的:
    OLAP 场景 第一种,OLTP 场景 第二第三种。
    opengps
        19
    opengps  
       2020-02-27 20:25:42 +08:00 via Android
    为了程序简单选择 1
    为了数据库能扩容,选择 2
    zivyou
        20
    zivyou  
       2020-02-27 20:30:01 +08:00
    个人第一种用的多些。主要写起来优雅一些,性能要求也没那么高
    reus
        21
    reus  
       2020-02-28 09:51:27 +08:00
    如果你不是用 mysql5.x,那没必要用 2、3。
    doudou1523102
        22
    doudou1523102  
       2020-02-28 10:46:00 +08:00
    觉得不用修改第一种,需要修改第二种,实际上第一种修改可能一个 sql 看一上午,要分段拿出 sql 看,很费时间
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   984 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:21 · PVG 04:21 · LAX 13:21 · JFK 16:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.