2012-07-14 87 views
0

我有一个查询是这样的:MySQL缓存查询的以前部分?

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“%输入%”两次一部分,或者如果它缓存第一个结果(这将很酷!)。

谢谢

回答

0

对不起,它没有。

作为一个穷人的测试,可以考虑:

delimiter // 
create function qqq() 
returns int no sql 
begin 
    set @x:[email protected]+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 | 
+------+ 

尽管人们可以争辩说,这是一个特殊的情况,因为我们调用存储程序,而不是内置的功能,也没有差异。一切都被重新评估。

这可能会在未来发生变化 - 没有什么要严格的阻止此优化发生在众所周知的确定性函数上。但有时这可能很难由优化器进行诊断。

+0

非常有趣 - 如果不是有点令人失望,嘿。也许我会在未来找到更好的查询方式,尽管现在,双LIKE比较器似乎在快速/足够地完成它的工作。这是一个搜索建议框,响应是即时的。 – felamaslen 2012-07-14 12:39:39

+0

但是,我不明白这个需求:'if(t2 LIKE'%input%',2,0)'在你的查询中总是** ** ** ** 2 **,那种状况! – 2012-07-14 12:45:45

+0

是的,不可否认,这是一个相当不好的例子。这不是我正在做的确切的查询,我只是想当场想到。 – felamaslen 2012-07-15 13:23:26