MySQL-和条件
假设我有这样一个问题:MySQL-和条件,mysql,Mysql,假设我有这样一个问题: SELECT bla WHERE foo LIKE '%bar%' AND boo = 'bar' AND whatvr IN ('foo', 'bar')... 我想知道MySQL在检索结果时是否会继续检查所有条件。 例如,如果foo不像%bar%那样,它是否会继续检查boo='bar',依此类推 如果我在最后提出不太可能成立的条件,会更快吗 很抱歉,如果这似乎是一个愚蠢的问题,那么在SQL方面我是一个彻头彻尾的傻瓜:)我不认为有任何关于多个条件是否会短路的保证,但是
SELECT bla WHERE foo LIKE '%bar%' AND boo = 'bar' AND whatvr IN ('foo', 'bar')...
我想知道MySQL在检索结果时是否会继续检查所有条件。
例如,如果foo
不像%bar%那样,它是否会继续检查boo='bar'
,依此类推
如果我在最后提出不太可能成立的条件,会更快吗
很抱歉,如果这似乎是一个愚蠢的问题,那么在SQL方面我是一个彻头彻尾的傻瓜:)我不认为有任何关于多个条件是否会短路的保证,但是
一般来说,您应该将查询优化程序视为一个黑盒子,并假设(除非您有相反的证据)它将正确地完成其工作。优化人员的工作是确保尽可能高效地检索请求的数据。如果最有效的计划涉及短路,那么它就会这样做;如果没有,那就不会了
(当然,查询优化程序并不完美。如果有证据表明查询执行得不理想,那么通常需要重新排序和/或重新声明查询,以查看是否有任何变化。)您不能依赖MySQL从左到右的评估条件(与任何编程语言相反)。这是因为“WHERE子句优化器”查找已编制索引的列,并将首先查找该子集
有关查询优化,请参阅MySQL参考手册中的章节。您要查找的是有关MySQL的短路评估的文档。然而,我找不到比找不到文档的人更好的东西,但他们已经测试了它,发现它是真的,即MySQL短路
如果我在最后提出不太可能成立的条件,会更快吗
否,优化器将尝试优化(!)处理顺序。因此,关于测试的顺序,您不应该假设任何东西。我不指望这一点:。该链接解释了订单上的其他标准。如果在第一个条件失败时(最有可能)短路,最好将最有可能失败的条件放在第一位
假设我们有3个条件,所有条件都必须为真(用“and”分隔)。
慢案例:
1.永不失败。所有的行都被看穿了,成功了。
2.有时会失败。所有的行都被看穿了,仍然成功。
3.经常失败。所有的行都被看穿了,这次我们失败了。
结果:花了一段时间,但找不到匹配项
快速案例:
1.经常失败。所有行都已检查完毕,匹配失败。
2.有时会失败。由于短路导致搜索结束,因此未查看。
3.永不失败。由于短路导致搜索结束,因此未查看。
结果:快速计算,没有匹配
如果我错了,请纠正我。
我可以想象,所有的条件都被检查过,每一行看起来都是广告。这使得这件事少了很多。
如果字段的顺序与条件相同,则可以测量差异。根据SQL规范,此行为取决于实现: