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

假设我必须运行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

如果它没有区别:

根据我自己的经验,我知道条件1比条件2便宜,条件3比条件4便宜.

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

最佳答案 在实践中,MySQL可能会按顺序评估条件 – 假设您在查询中只有一个表.如果条件在表格之间,则所有投注均已关闭.

你的问题在某些方面尚不清楚.如果某些条件可以在编译时解决,那么它们通常会(见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中的运算符和函数,与检索行的时间相比,操作的时间并不重要.当然,也有例外.特别是,长字符串上的任何模式匹配都会相当昂贵.并且,对函数的调用也可能非常昂贵.

点赞