假设我有这样的查询:
SELECT bla WHERE foo LIKE '%bar%' AND boo = 'bar' AND whatvr IN ('foo', 'bar')...
我想知道MySQL在检索结果时是否继续检查所有条件。
例如。如果foo
不是LIKE %bar%
,是否会继续检查是否boo = 'bar'
,等等?
如果我把最不可能的条件放在最后会更快吗?
我很抱歉,如果这似乎是一个愚蠢的问题,在谈到SQL时我是一个完整的菜鸟:)
答案 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.有时会失败。没有查看,因为搜索由于短路而结束。 永远不会失败。没有查看,因为搜索由于短路而结束。 结果:快速计算,不匹配。
如果我错了,请纠正我。 我可以想象,所有条件都经过检查,每行看广告。这使得这件事情变得更少了。 如果您的字段按照您的条件以相同的顺序排序,您可以测量差异。