MySQL - AND条件

时间:2010-12-15 10:52:51

标签: mysql

假设我有这样的查询:

SELECT bla WHERE foo LIKE '%bar%' AND boo = 'bar' AND whatvr IN ('foo', 'bar')...

我想知道MySQL在检索结果时是否继续检查所有条件。 例如。如果foo不是LIKE %bar%,是否会继续检查是否boo = 'bar',等等?

如果我把最不可能的条件放在最后会更快吗?

我很抱歉,如果这似乎是一个愚蠢的问题,在谈到SQL时我是一个完整的菜鸟:)

5 个答案:

答案 0 :(得分:4)

我认为对于多个条件是否会被短路有任何保证,但......

通常,您应该将查询优化器视为黑盒子,并假设 - 除非您有相反的证据 - 它将正确地完成其工作。优化器的工作是确保尽可能高效地检索所请求的数据。如果最有效的计划涉及短路,那么它就会这样做;如果没有,则不会。

(当然,查询优化器并不完美。如果您有证据表明查询没有以最佳方式执行,那么通常需要重新排序和/或重新说明查询以查看是否有任何更改。)< / p>

答案 1 :(得分:2)

您正在寻找的是关于MySQL的短路评估的文档。但是,我没有找到比能够找到文档的人更好的东西,但是他们claim已经对它进行了测试并发现它是真的,即MySQL短路。

  

如果我把最不可能的条件放在最后会更快吗?

不,优化器会尝试优化(!)处理顺序。因此,对于测试的 order ,你应该假设任何事情。

答案 2 :(得分:2)

我不会指望:Where Optimisations。该链接解释了其他标准在订单上占优势。

答案 3 :(得分:1)

您不能依赖MySQL从左到右评估条件(与任何编程语言相对)。这是因为&#34; WHERE子句优化器&#34;查找已编制索引的列,并首先查找此子集。

有关查询优化,请参阅MySQL参考手册中的Optimizing SELECT Statements一章。

答案 4 :(得分:0)

如果在第一个条件失败时(最有可能)发生短路,最好先放置那些最有可能失败的条件!

假设我们有3个条件,所有条件都必须为真(以“AND”分​​隔)。 慢的情况:  永远不会失败查看所有行并成功。  2.有时会失败。查看所有行并仍然成功。  经常失败。查看所有行,这次我们失败了。 结果:花了一段时间,但找不到匹配。

快速案例:  经常失败查看所有行并匹配失败。  2.有时会失败。没有查看,因为搜索由于短路而结束。  永远不会失败。没有查看,因为搜索由于短路而结束。 结果:快速计算,不匹配。

如果我错了,请纠正我。 我可以想象,所有条件都经过检查,每行看广告。这使得这件事情变得更少了。 如果您的字段按照您的条件以相同的顺序排序,您可以测量差异。