2012-04-17 123 views
0

Optimizing your SQL queries的一篇文章曾建议使用联盟insted的的或`原因:至少在
在MySQL OR-情况下,使用的时候我是否必须使用UNION insted JOIN?

利用联盟的替代或

指数失去了速度优势。因此,虽然索引是
施加1 SELECT * FROM TABLE WHERE COLUMN_A =“值” OR
COLUMN_B =“值”

在另一方面,使用联盟如此将利用索引这将不会是有用。
1- SELECT * FROM TABLE WHERE COLUMN_A = '值'
2- UNION 3- SELECT * FROM
TABLE WHERE COLUMN_B = '值'

多少这个建议是真的?我应该把我的OR查询交给Union吗?

+0

敏锐的读者会注意到这些例子涉及在**不同**列上操作的ORing条件,这当然不是偶然的。你自己的ORs是那样的吗? – Jon 2012-04-17 11:09:18

+0

积极。你有什么建议? – ALH 2012-04-17 11:12:18

+0

出于我的领域,所以不能说。但是你可以'解释'这两个查询,看看MySql怎么看待它们。 – Jon 2012-04-17 11:14:18

回答

0

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

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

  1. Make if run。
  2. 让它正确运行。
  3. 让它跑得快。

优化实际上是你应该做的最后一件事。

分享和享受。


跟帖:我没有注意到的是,“OR”看着不同的列(我的坏),但我的建议关于“保持简单”犹抱。

+0

如果这是一个代码清晰的问题,我会说你是对的,但SQL查询处理巨大的while循环,可能涉及数百万条记录。如果你不优化这些,你会优化什么? – Neil 2012-04-17 11:18:55

+0

@Neil:根据我的经验,只有在出现性能问题时才能尝试优化。如果并且直到出现性能问题,没有什么可以优化的,因为这样的优化工作将浪费在不成问题的事情上。我发现最好写出最干净和最简单的代码,因为A)大多数时候它会工作得很好,以及B)当性能问题出现时,简单的代码可以很容易理解,可以创建性能更好的版本。 – 2012-04-17 11:27:22

+1

@Bob_Jarvis:那么意见分歧。我认为如果优化并不意味着牺牲清晰度,你应该这样做。我不认为工会不清楚,而是相反。事实上,有时将长sql查询合并为一个select可能很难阅读。 – Neil 2012-04-17 12:40:01

0

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

现在如果我告诉你在电话簿中以名称John Smith或电话号码863-2253查找条目,该怎么办。没有那么快,呃?为了提供准确的答案,您需要一个电话簿来查找约翰史密斯和另一个电话号码,以便通过他或她的电话号码查找姓名。

也许一个更复杂的引擎可能会看到这种分离的需要并自动执行,但显然MySQL不会。所以虽然这样做可能看起来很麻烦,但我向你保证,高记录数表的差异是显而易见的。

相关问题