V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
labasq
V2EX  ›  数据库

数据库的 join 查询,子查询,程序的循环语句哪个快一点?

  •  
  •   labasq · 2017-03-06 13:56:09 +08:00 · 1913 次点击
    这是一个创建于 2842 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一: JOIN 连表查询

    二:( select * from ***) 嵌套子查询

    三:先查一条主表然后循环主表记录数据再查附表。

    这几种哪个快一点?或者还有什么方法?

    现在做 model 层的公共查库方法

    每个方法我都 join 了十几张表,作为公共方法统一调用。

    27 条回复    2017-03-09 08:28:14 +08:00
    liangWL
        1
    liangWL  
       2017-03-06 14:06:06 +08:00
    用视图,或者你说的第一种应该是最快的
    tianshuang
        2
    tianshuang  
       2017-03-06 14:08:23 +08:00
    快不快 explain 下
    yeyuexia
        3
    yeyuexia  
       2017-03-06 14:10:09 +08:00
    join 查询是最快的……你那种直接作 view 吧……
    domty
        4
    domty  
       2017-03-06 14:10:16 +08:00
    join+索引
    labasq
        5
    labasq  
    OP
       2017-03-06 14:34:00 +08:00
    @liangWL
    @yeyuexia

    好,我试一下视图,不过视图有什么缺点没有?
    labasq
        6
    labasq  
    OP
       2017-03-06 14:34:48 +08:00
    @tianshuang

    好多查询都 explain 嘛?
    labasq
        7
    labasq  
    OP
       2017-03-06 14:35:31 +08:00
    @domty

    有时候中间表不做索引 - -!那样的效率?
    yeyuexia
        8
    yeyuexia  
       2017-03-06 14:45:42 +08:00
    @labasq 除了不够灵活以外没什么缺点 一般常用的确定的复杂查询都建议用 view 来做的
    其实 如果是做报表,为了效率等考虑,又不要求很高的实时性的话,还是建议用异步任务来生成专门的表。毕竟数据量大了之后 join 性能也很让人心碎……
    ncisoft
        9
    ncisoft  
       2017-03-06 16:05:35 +08:00 via Android
    你用什么数据库?
    fantastM
        10
    fantastM  
       2017-03-06 18:55:57 +08:00
    3 是写两个 sql 的意思吗?拆分 sql 、子查询、连接查询的效率,没有肯定的答案,优化复杂 sql 的关键是索引。“最优”的索引有时比“好的”索引性能要好两个数量级......

    另外,自己不清楚执行效率的 sql ,都应该 exlpain 一下。
    tramedy
        11
    tramedy  
       2017-03-06 18:57:54 +08:00
    join + 索引,如果中间表没有索引,说明数据库索引设计有问题。除非中间表很小
    mingyun
        12
    mingyun  
       2017-03-06 23:18:13 +08:00
    分开查询吧
    ivvei
        13
    ivvei  
       2017-03-06 23:59:31 +08:00 via Android
    @labasq 别听嚷嚷着视图的人瞎扯…
    labasq
        14
    labasq  
    OP
       2017-03-07 08:17:27 +08:00
    @yeyuexia
    用视图 是不是我在查询的时候 其实视图再自查一次?
    labasq
        15
    labasq  
    OP
       2017-03-07 08:17:42 +08:00
    @ncisoft
    MySQL
    labasq
        16
    labasq  
    OP
       2017-03-07 08:21:06 +08:00
    @fantastM
    是的,我通常是一条 join 过去,但我看到项目有人写 循环再 select ,
    一个操作几十上百条 select 都有可能
    labasq
        17
    labasq  
    OP
       2017-03-07 08:22:19 +08:00
    @tramedy
    好,那把所有关联加上索引
    labasq
        18
    labasq  
    OP
       2017-03-07 08:22:31 +08:00
    @mingyun
    分开查询是说?
    labasq
        19
    labasq  
    OP
       2017-03-07 08:22:59 +08:00
    @ivvei
    视图有什么缺点?请问下
    ivvei
        20
    ivvei  
       2017-03-07 09:04:09 +08:00
    @labasq 视图没什么缺点。但是对于加快你的查询速度毫无不相干。
    ncisoft
        21
    ncisoft  
       2017-03-07 09:44:36 +08:00 via Android
    @labasq MySQL 的表连接基本就是废物一个,自己用 explain 看看能不能有效利用索引吧,也许加提示( hint ?)能管点用
    blacklee
        22
    blacklee  
       2017-03-07 10:18:50 +08:00
    针对标题来讲:这种问题都是具体问题具体分析。
    针对主贴来讲:如果都 join 了 10+张表,我看不出多次 select 的坏处在哪里。
    图省事来讲:就全部 join ,性能问题丢给 DBA 去。
    有责任心+便利来讲:那就拆分 join 到数据量大的表为多一次 select ,数据量小的表直接 join 。
    yeyuexia
        23
    yeyuexia  
       2017-03-07 14:26:57 +08:00
    @labasq https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html
    顺便楼上没一点干货就在那说别人瞎扯的 啧啧
    labasq
        24
    labasq  
    OP
       2017-03-08 08:44:19 +08:00
    @ivvei
    就是说只是方便了操作,并非提高了速度
    labasq
        25
    labasq  
    OP
       2017-03-09 08:26:59 +08:00
    @ncisoft
    好的 试试
    labasq
        26
    labasq  
    OP
       2017-03-09 08:27:59 +08:00
    @blacklee
    多次 select 要循环主表,一个操作就要几十条 select ,甚至过百啊
    labasq
        27
    labasq  
    OP
       2017-03-09 08:28:14 +08:00
    @yeyuexia
    ......额
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   958 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:54 · PVG 02:54 · LAX 10:54 · JFK 13:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.