0

我有一个类似这样的查询:

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%' 两次,或者它是否缓存了第一个结果(这很酷!)。

谢谢

4

1 回答 1

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 |
+------+

虽然有人可能会说这是一种特殊情况,但由于我们调用的是存储例程,而不是内置函数,所以目前没有区别。一切都重新评估。

这在未来可能会改变——没有什么可以严格阻止这种优化发生在众所周知的确定性函数上。但有时这可能很难被优化器诊断出来。

于 2012-07-14T12:27:15.203 回答