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

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

  •  
  •   mushishi · 161 天前 · 1836 次点击
    这是一个创建于 161 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    @leon0903 你什么查询需要在 B 里查 100 万条记录?
    如果真的有那么大的数据量过滤,放到 MySQL 内部做也不会更快。
        18
    akira   160 天前
    @7654 报表性质不一样,24 小时能跑出来就行
        19
    armysky   160 天前 via Android
    如果表之间的关联是能命中索引,当然是写表关联了
        20
    mushishi   155 天前
    还是觉得两张表 join,再处理数据好一点。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   958 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 20:56 · PVG 04:56 · LAX 12:56 · JFK 15:56
    ♥ Do have faith in what you're doing.