我必须使用UNION而不是JOIN吗?

时间:2012-04-17 11:04:30

标签: join mysqli union

关于Optimizing your SQL queries的一篇文章建议使用联盟的OR'原因:

  

使用Union而不是OR

     

索引在使用OR的情况下失去速度优势   MySQL至少。因此,尽管索引是
,这将没有用   被应用1 SELECT * FROM TABLE WHERE COLUMN_A ='value'或
  COLUMN_B ='价值'

     

另一方面,使用此类联盟将使用索引   1- SELECT * FROM TABLE WHERE COLUMN_A ='value'
  2-联盟   3- SELECT * FROM
  表WHERE COLUMN_B ='value'

这个建议多少是真的?我应该将我的OR查询转为Union吗?

2 个答案:

答案 0 :(得分:0)

我不建议将此作为一般规则。我没有在这里安装MySQL,因此无法检查生成的执行计划,但在Oracle中,计划有很大不同,“OR”计划比“UNION”计划更有效。 (基本上,'UNION'必须执行两个SELECT然后合并结果 - 'OR'只需要执行一个SELECT)。即使是'UNION ALL'计划的成本也高于'OR'计划。坚持使用'或'。

我强烈建议您尽可能编写最清晰,最简单的代码。对我来说,这意味着你应该使用'OR'而不是'UNION'。多年来我发现尝试“预先优化”某些东西,或者换句话说,猜测我会遇到性能问题,然后尝试围绕这些问题进行编码,这是浪费时间。代码往往会花费大量时间在最困难的地方,并且只有在代码运行后才能找到它们。很久以前,我学会了三条规则,我发现这些规则在这方面很有用:

  1. make if run。
  2. 让它运行正确。
  3. 让它快速运行。
  4. 优化实际上是你应该做的最后一件事。

    分享并享受。


    跟进:我没有注意到'OR'正在查看不同的列(我的不好),但我对“保持简单”的建议仍然存在。

答案 1 :(得分:0)

有助于考虑电话簿中的名称等索引。你可以说,电话簿按名称有一个自然排序的索引,这意味着,如果你想找到所有名字John Smith,你几乎没有时间找到它。你只需将电话簿打开到S部分,然后开始查找史密斯。

现在,如果我告诉您在电话簿中查找姓名为John Smith或电话号码为863-2253的条目,该怎么办?不是那么快,呃?为了提供准确的答案,您需要一本电话簿来查找John Smith和另一个按电话号码排序的电话簿,以便通过他或她的电话号码查找姓名。

也许一个更复杂的引擎可以看到这种分离的需要并自动完成,但显然MySQL没有。因此,虽然以这种方式执行它似乎很麻烦,但我向您保证,具有高记录数的表格的差异是显而易见的。

相关问题