代码之家  ›  专栏  ›  技术社区  ›  lsl

SQL(任意)请求了解查询优化

  •  0
  • lsl  · 技术社区  · 17 年前

    我想知道,如果有任何好处,从以下,更紧迫的是,它甚至会给出预期的结果。

    select a.* from a where a.id in (select id from b where b.id = a.id)
    

    作为替代方案:

    select a.* from a where a.id in (select id from b)
    

    MySQL 再具体不过了对不起 例如,使用*is

    编辑,b未被选中

    7 回复  |  直到 17 年前
        1
  •  2
  •   Andomar    17 年前

    您列出的两个查询等效于:

    select a.* 
    from a 
    inner join b on b.id = a.id
    

    几乎所有优化器都将以相同的方式执行它们。

    你可以发布一个真正的执行计划,这里的人可能会给你一个加速的方法。如果指定正在使用的数据库服务器,则会有所帮助。

        2
  •  2
  •   Bill Karwin    17 年前

    select a.* from a where a.id in (select id from b where b.id = a.id)
    
    select a.* from a where a.id in (select id from b)
    

    相关 子查询。它可能会导致MySQL为每个行执行子查询 a .

    非相关 A. .

        3
  •  0
  •   dpmattingly    17 年前

    YMMV,但我经常发现使用EXISTS而不是IN可以使查询运行得更快。

    SELECT a.* FROM a WHERE EXISTS (SELECT 1 FROM b WHERE b.id = a.id)
    

    当然,如果看不到查询的其余部分和上下文,这可能不会使查询更快。

    加入可能是一个更可取的选择,但如果a.id在b的id列中多次出现,则必须在其中加入一个DISTINCT,并且很可能会在优化方面倒退。

        4
  •  0
  •   HLGEM    17 年前

    我永远不会使用这样的子查询。加入会快得多。

    select a.*
    from a 
    join b on a.id = b.id
    

    当然,也不要使用select*(尤其是在进行连接时不要使用它,因为至少有一个字段是重复的),这样会浪费网络资源来发送所需的数据。

        5
  •  0
  •   Russ Cam    17 年前

    你看过执行计划了吗?

    怎么样

    select a.* 
    from a 
    inner join b
    on a.id = b.id
    

    假设id字段是主键?

        6
  •  0
  •   JeffO    17 年前
    Select a.* from a
    inner join (Select distinct id from b) c
    on a.ID = c.AssetID
    

    我尝试了所有3个版本,它们的运行方式大致相同。执行计划是相同的(内部联接,IN(子查询中有和没有where子句),存在)

    由于您没有从B中选择任何其他字段,因此我更喜欢使用Where IN(选择…)任何人都会查看查询并知道您试图执行的操作(仅在a if IN B中显示)。

        7
  •  0
  •   KM.    17 年前

    您的问题最有可能出现在“a”中的七个表中

    使FROM表包含“a.id” 进行下一个连接:a.id=b.id上的内部连接b