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

mysql 是三张表连接查询还是分开 2+1 然后在处理合并数据?

  •  
  •   mushishi · 2019-06-06 17:09:21 +08:00 · 3429 次点击
    这是一个创建于 1757 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道给位是怎么处理的?能否给一些建议?主表是 45W 左右的数据,从表大概 8W 左右。

    20 条回复    2019-06-12 15:32:17 +08:00
    moodasmood
        1
    moodasmood  
       2019-06-06 17:43:17 +08:00
    这么点数据,瞎 jb 操作都合理
    moodasmood
        2
    moodasmood  
       2019-06-06 17:44:30 +08:00
    最好业务层处理,查询 3 次,数据库层面不做任何拼表
    securityCoding
        3
    securityCoding  
       2019-06-06 17:51:18 +08:00
    做好索引 , 数据量不大的话单表 /连表都行的.

    推荐 2 楼的做法
    des
        4
    des  
       2019-06-06 17:52:09 +08:00 via Android
    看情况吧,分开了好缓存
    Tianao
        5
    Tianao  
       2019-06-06 20:49:31 +08:00 via iPhone
    #2 +1,不要在数据库层面搞骚操作,交给业务逻辑去做。
    akira
        6
    akira  
       2019-06-06 20:52:42 +08:00
    a 连 b 连 c 的话 ,真不建议,一堆人搞不定的,
    还不如按 2l 拆开来写
    DreamSpace
        7
    DreamSpace  
       2019-06-06 21:02:10 +08:00 via Android
    @moodasmood #2 为什么要查 3 次呢?查 3 次感觉会比一次拉出来慢很多,还要消耗额外的连接数,组装数据时还会有内存和性能上的开销。
    Leammin
        8
    Leammin  
       2019-06-06 21:23:47 +08:00 via Android
    @DreamSpace 一次查询的话其实就是把应用层的性能开销转移到了数据库层,但数据库层的资源非常宝贵,所以一般都在应用层处理。
    Lighfer
        9
    Lighfer  
       2019-06-06 21:36:30 +08:00
    @DreamSpace 数据库的可扩展性比上层应用差得多,因此资源也就要珍贵得多,上层应用开销大点问题不大,内存不够了,cpu 不够了,加机器就是了,相比较而言数据库就没那么简单了
    leon0903
        10
    leon0903  
       2019-06-06 21:44:58 +08:00
    其实我也有一个疑问 都说在业务层自己拆开按照单表去查,但是这样的话如果有分页呢?还有就是假如第一次从 A 表中查出来有 100w 条数据,然后要把这 100w 条数据当作条件放到 B 表中去查询,这样的话生成的 sql(如 where id in(.........................................) )难道不会超出 mysql 限制吗(我知道 mysql 这个参数可以调整,但是这终究是一次很大的网络消耗,而且容易失败)?
    7654
        11
    7654  
       2019-06-06 21:53:09 +08:00
    @akira #6 真的有这么惨的吗。。。。
    内部有个 sql plus 执行的简单报表,定时执行,经常手撸 SQL,连接时间设置的越来越长,已经 600 秒了
    razertory
        12
    razertory  
       2019-06-06 22:12:17 +08:00
    三表 join,索引做好了没有问题的
    sonyxperia
        13
    sonyxperia  
       2019-06-06 22:49:47 +08:00
    是不是问问你们的 DBA 啊
    liprais
        14
    liprais  
       2019-06-06 23:00:52 +08:00
    很少有人自己手写能比数据库跑的快的
    mysql 除外,他的 join 本身就很烂
    jiezhi
        15
    jiezhi  
       2019-06-06 23:07:34 +08:00 via iPhone
    联表查过二十多张表……

    四百多行的 SQL 语句😂,不过我是搞数据的
    version
        16
    version  
       2019-06-06 23:13:53 +08:00
    如果是 api 接口的一般拆 3 个 sql 再 redis 缓存
    如果是数据统计.看业务吧.有些过滤可以是 redis 存 id 或者其它方式来过滤.再 sql.都可以.
    具体看业务了.没有绝对的方法..为了性能还是为了好修改好写代码
    msg7086
        17
    msg7086  
       2019-06-06 23:18:03 +08:00
    @DreamSpace 想一想数据库的扩展性和应用程序服务器的扩展性。
    数据库做一个集群代价很高,但是应用程序服务器你随便搞个几千台都不是问题。

    @leon0903 你什么查询需要在 B 里查 100 万条记录?
    如果真的有那么大的数据量过滤,放到 MySQL 内部做也不会更快。
    akira
        18
    akira  
       2019-06-07 15:10:42 +08:00
    @7654 报表性质不一样,24 小时能跑出来就行
    armysky
        19
    armysky  
       2019-06-07 21:20:10 +08:00 via Android
    如果表之间的关联是能命中索引,当然是写表关联了
    mushishi
        20
    mushishi  
    OP
       2019-06-12 15:32:17 +08:00
    还是觉得两张表 join,再处理数据好一点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   950 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:05 · PVG 05:05 · LAX 14:05 · JFK 17:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.