数据库的 join 查询,子查询,程序的循环语句哪个快一点? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
labasq
V2EX    数据库

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

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

    一: 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
    用视图,或者你说的第一种应该是最快的
    argos
        2
    argos  
       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     Solana     3178 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 11:39 PVG 19:39 LAX 03:39 JFK 06:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86