MySQL中的命令是否与谓词的短路有关?

时间:2015-06-28 10:17:05

标签: mysql sql

我们说我必须运行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

如果它没有区别:

根据我自己的经验,condition1condition2便宜condition3condition4便宜initComponent

如果不满足任何先前条件,则不应检查剩余条件。由于涉及存储的函数,优化器不会立即显而易见。我该如何编写一个执行此操作的查询?

2 个答案:

答案 0 :(得分:2)

实际上,MySQL 可能按顺序评估条件 - 假设您在查询中只有一个表。如果条件在表之间,则所有投注均已关闭。

您的问题在某些方面尚不清楚。如果某些条件可以在编译时解决,那么它们通常会(见here)。一旦表达式在AND的链中评估为FALSE,那么它就不需要进一步评估表达式。

如果没有明确的文档,您可以回退评估顺序的ANSI定义。 Here是关于该特定主题的问题。这基本上表明评估顺序无法保证。它确实表明:

where ((((condition1 and condition2) and condition3) and condition4)

将保证按特定顺序进行评估。我怀疑在编译阶段会丢弃多余的括号,并且ANSI条件不像看起来那么清晰。

在SQL中保证评估顺序的唯一表达式是case表达式。虽然我不喜欢在case子句中使用where,但您可以这样做:

where (case when not condition1 then 0
            when not condition2 then 0
            when not condition3 then 0
            else not condition4
       end)

这将保证评估顺序。

顺便说一句,对于MySQL中的运算符和函数,与检索行的时间相比,操作的时间并不重要。当然,也有例外。特别是,长字符串上的任何模式匹配都会相当昂贵。并且,调用函数也可能非常昂贵。

答案 1 :(得分:0)

开始调查的地方是使用explain,它会显示优化程序为您的特定查询执行的操作。

有几个例子供研究;这些似乎很有用:

鉴于这些工具,其他人声称MySQL会进行短路查询:

  • MySQL 12.3.3 Logical Operators开发者的评论说
      

    文档没有关于此的任何内容,但出现(基于我刚刚运行的一些测试),MySQL短路评估逻辑运算符就像大多数其他语言都可以。

虽然相关的订单可能不是:

但是,正如MySQL文档 comments 中所述,文档本身并不明确。您必须使用适当的工具并依赖优化器的可重复行为来确定实际的事务状态。