我有一个类似这样的查询:
SELECT t1, t2,
IF(MATCH(t2) AGAINST ('input*' IN BOOLEAN MODE), 10, 0) AS matches,
IF(t2 LIKE '%input%', 2, 0) AS similar
FROM tbl
WHERE t2 LIKE '%input%'
ORDER BY (matches + similar) DESC
LIMIT 5
查询工作正常,但我关注的部分是MySQL是否检查t2是否是LIKE'%input%'两次,或者它是否缓存了第一个结果(这很酷!)。 / p>
由于
答案 0 :(得分:0)
抱歉,没有。
作为一个穷人的考试,请考虑:
delimiter //
create function qqq()
returns int no sql
begin
set @x:=@x+1;
return 17;
end //
delimiter ;
set @x := 0;
select qqq(), qqq(), qqq() > 1, qqq() > 1 from dual;
+-------+-------+-----------+-----------+
| qqq() | qqq() | qqq() > 1 | qqq() > 1 |
+-------+-------+-----------+-----------+
| 17 | 17 | 1 | 1 |
+-------+-------+-----------+-----------+
select @x;
+------+
| @x |
+------+
| 4 |
+------+
虽然有人可以说这是一种特殊情况,但由于我们调用的是存储例程,而不是内置函数,因此目前没有区别。一切都被重新评估。
这可能会在未来发生变化 - 没有什么可以严格阻止这种优化发生在众所周知的确定性函数上。但有时这可能很难被优化器诊断出来。