使用联盟或加入 - 什么是更快

Jac*_*ada 24 mysql sql

我只是想知道你是否有一张桌子并且你加入它会比使用连接更有效吗?

我知道连接会创建更多的列,但这更具理论性 - 工会是否需要像连接一样对另一个表进行嵌套循环扫描?

Mic*_*han 25

Union会更快,因为它只是传递第一个SELECT语句,然后解析第二个SELECT语句并将结果添加到输出表的末尾.

Join将遍历两个表的每一行,在另一个表中查找匹配项,因此需要进行更多处理,因为每行都在搜索匹配的行.

编辑

通过Union,我的意思是Union All,因为它似乎足以满足您的目标.虽然普通联盟通常比加盟更快.

编辑2(回复@seebiscuit的评论)

我不同意他的看法.从技术上讲,无论您的加入有多好,"加入"仍然比纯连接更昂贵.我发了一篇博文,在我的博客codePERF [dot] net上证明了这一点.实际上,它们有两个完全不同的用途,更重要的是确保您的索引正确并使用正确的工具来完成工作.

从技术上讲,我认为可以使用我的博客文章中的以下2个执行计划来总结:

UNION ALL 执行计划

UNION ALL执行计划

JOIN 执行计划

加入执行计划

实际结果

实际上,聚集索引查找的差异可以忽略不计:

基准测试结果

  • 你所描述的不是UNION而是UNION ALL.UNION必须匹配结果之间的记录才能删除重复项.这可能比进行加入更加昂贵. (3认同)
  • @seebiscuit 查看我对我的评论的编辑。无论喜欢什么,“UNION ALL”都会比任何“JOIN”都快。但最重要的是,它们是用于 2 种不同工作的 2 种不同工具。 (2认同)

Ign*_*ams 22

JOINUNION有两个不同的目的.JOIN用于向查询添加其他表,以便添加选择条件和可能的其他列.UNION用于将两个不同查询的结果与相同列组合在一起.问哪个更有效就像问"哪条面包"和"吹风"更"橙".

  • "一条面包"肯定比"吹风"更"橙色";-) (25认同)
  • 不一定,它们可以用于实现完全相同的事情.内部为ON x OR y的连接(SLOW)或具有单独连接X和连接Y的2个查询联合在一起.同样的结果,BIG性能差异. (7认同)

小智 10

抱歉打破你的派对,但写得好的联合会比工会更快.

  • 它使用更轻量级的统计信息收集模型(基于基数,而不是随机潜水)
  • 查询只会被解析一次(不需要多次子选择评估)
  • 结果集不会在temptable中实现(甚至对于UNION ALL也是如此)