Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-和条件_Mysql - Fatal编程技术网

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规范,此行为取决于实现: