假设我必须运行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中的运算符和函数,与检索行的时间相比,操作的时间并不重要.当然,也有例外.特别是,长字符串上的任何模式匹配都会相当昂贵.并且,对函数的调用也可能非常昂贵.