mysql - MySQL 中的顺序对于谓词短路是否重要?

标签 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 便宜 比 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/

相关文章:

php - 使用 mysql 从表中的一行中获取单行文本

mysql - PDO:从包含反斜杠的数据库中选择字段

sql - "column ambiguously defined"

mysql - 仅当两行(不是任一行)都满足时才选择条件

mysql - 如何解决 Entity Framework 开放数据读取器问题

php - 通过函数传递 PHP 变量

MySQL双主

MySQL连接必须包含特定值的表

sql - 过滤 SQL 行

mySQL 删除带有 count(*) GROUP 和 HAVING 的行