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

我必须使用UNION而不是JOIN吗?,join,mysqli,union,Join,Mysqli,Union,一篇关于的文章建议使用Union而不是“原因”: 使用联合而不是或 在中使用索引时,索引将失去其速度优势 至少是MySQL。因此,尽管索引是,但这将不会有用 正在应用1从表格中选择*,其中列A='value'或 列_B='值' 另一方面,使用这样的联合将利用索引。 1-从表格中选择*,其中列A='值' 2-工会 3-从中选择* 表中的列_B='value' 这个建议在多大程度上是正确的?我应该将我的或查询转到Union吗?我不建议将此作为一般规则。我没有在这里安装MySQL,因此无法检查生成的执

一篇关于的文章建议使用Union而不是“原因”:

使用联合而不是或


中使用索引时,索引将失去其速度优势 至少是MySQL。因此,尽管索引是
,但这将不会有用 正在应用1从表格中选择*,其中列A='value'或
列_B='值'

另一方面,使用这样的联合将利用索引。
1-从表格中选择*,其中列A='值'
2-工会 3-从
中选择* 表中的列_B='value'


这个建议在多大程度上是正确的?我应该将我的或查询转到Union吗?

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

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

  • 如果你跑了,就做吧
  • 让它正常运行
  • 让它跑得很快
  • 优化实际上是你最不应该做的事情

    分享和享受



    后续:我没有注意到“OR”在不同的列上(我不好),但我关于“保持简单”的建议仍然有效。

    把索引想象成电话簿中的名字是有帮助的。你可以说,电话簿有一个按姓名自然排序的索引,这意味着,如果你想找到约翰·史密斯所有的名字,你几乎不需要时间就能找到它。您只需打开S区的电话簿,开始查找史密斯

    现在,如果我告诉你在电话簿中查找姓名为约翰·史密斯或电话号码为863-2253的条目,该怎么办。没那么快,嗯?为了提供准确的答案,你需要一本电话簿来查找约翰·史密斯,另一本按电话号码排序,以便根据他或她的电话号码查找姓名


    也许一个更复杂的引擎可以看到这种分离的必要性并自动进行,但MySQL显然没有。因此,虽然这样做似乎很麻烦,但我向您保证,记录计数高的表之间的差异是显而易见的。

    精明的读者会注意到,这些示例涉及在不同列上运行的ORing条件,这肯定不是偶然的。你自己的医生是这样的吗?是的。你有什么建议?不属于我的领域,所以不能说。但是你可以
    解释这两个查询,看看MySql对它们的看法。@Jon-drat。很明显,今天早上我只是精明的前一半。:-)我当然假设索引存在于每个单独的列上?如果这是一个代码清晰的问题,我会说你是对的,但是SQL查询处理的是可能涉及数百万条记录的巨大while循环。如果你不优化这些,你会优化什么?@Neil:根据我的经验,只有在出现性能问题时才能尝试优化。如果并且直到出现性能问题,就没有什么可优化的,因此优化工作将浪费在不成问题的事情上。我发现最好是编写尽可能干净、最简单的代码,因为A)大多数情况下它都可以正常工作,B)当出现性能问题时,简单的代码很容易理解,这样就可以创建性能更好的版本。@Bob_Jarvis:那么,意见不同了。我认为,如果优化并不意味着牺牲清晰度,那么你应该这样做。我不认为工会是不清楚的,恰恰相反。事实上,有时将长sql查询组合到单个select中可能很难阅读。