关于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吗?
答案 0 :(得分:0)
我不建议将此作为一般规则。我没有在这里安装MySQL,因此无法检查生成的执行计划,但在Oracle中,计划有很大不同,“OR”计划比“UNION”计划更有效。 (基本上,'UNION'必须执行两个SELECT然后合并结果 - 'OR'只需要执行一个SELECT)。即使是'UNION ALL'计划的成本也高于'OR'计划。坚持使用'或'。
我强烈建议您尽可能编写最清晰,最简单的代码。对我来说,这意味着你应该使用'OR'而不是'UNION'。多年来我发现尝试“预先优化”某些东西,或者换句话说,猜测我会遇到性能问题,然后尝试围绕这些问题进行编码,这是浪费时间。代码往往会花费大量时间在最困难的地方,并且只有在代码运行后才能找到它们。很久以前,我学会了三条规则,我发现这些规则在这方面很有用:
优化实际上是你应该做的最后一件事。
分享并享受。
跟进:我没有注意到'OR'正在查看不同的列(我的不好),但我对“保持简单”的建议仍然存在。
答案 1 :(得分:0)
有助于考虑电话簿中的名称等索引。你可以说,电话簿按名称有一个自然排序的索引,这意味着,如果你想找到所有名字John Smith,你几乎没有时间找到它。你只需将电话簿打开到S部分,然后开始查找史密斯。
现在,如果我告诉您在电话簿中查找姓名为John Smith或电话号码为863-2253的条目,该怎么办?不是那么快,呃?为了提供准确的答案,您需要一本电话簿来查找John Smith和另一个按电话号码排序的电话簿,以便通过他或她的电话号码查找姓名。
也许一个更复杂的引擎可以看到这种分离的需要并自动完成,但显然MySQL没有。因此,虽然以这种方式执行它似乎很麻烦,但我向您保证,具有高记录数的表格的差异是显而易见的。