假设我必须运行 SQL 查询:
SELECT data FROM table WHERE condition1 AND condition2 AND condition3 AND condition4
这有什么不同
SELECT data FROM table WHERE condition3 AND condition1 AND condition4 AND condition2
?
如果不一样:
根据我自己的经验,我知道 condition1
比 condition2
便宜 比 condition3
便宜 比 condition4 便宜
。
如果不满足任何先验条件,则不应检查其余条件。由于涉及存储函数,因此优化器不会立即显而易见。我应该如何编写执行此操作的查询?
最佳答案
实际上,MySQL 可能 按顺序计算条件——假设您在查询中只有一个表。如果条件介于两 table 之间,则所有赌注均无效。
您的问题在某些方面不清楚。如果某些条件可以在编译时解决,那么它们通常会解决(参见 here )。一旦表达式在 AND
链中的计算结果为 FALSE,则不需要进一步计算表达式。
如果没有明确的文档,您可以求助于评估顺序的 ANSI 定义。 Here是关于该特定主题的问题。这基本上表示无法保证评估顺序。它确实表明:
where ((((condition1 and condition2) and condition3) and condition4)
将保证按特定顺序进行评估。我怀疑在编译阶段会删除多余的括号,而且 ANSI 条件并不像看起来那么清楚。
保证 SQL 中求值顺序的唯一表达式是case
表达式。虽然我不喜欢在 where
子句中使用 case
你可以这样做:
where (case when not condition1 then 0
when not condition2 then 0
when not condition3 then 0
else not condition4
end)
这将保证评估顺序。
顺便说一下,对于 MySQL 中的运算符和函数,与检索行的时间相比,操作的时间并不重要。当然,也有异常(exception)。特别是,长字符串上的任何模式匹配都将非常昂贵。而且,对函数的调用也可能非常昂贵。
关于mysql - MySQL 中的顺序对于谓词短路是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31098611/