2015-09-26 116 views
1

例如,我有这个条件能Mysql的缓存调用相同功能与相同参数

WHERE f1=CONCAT(v1,v2) OR f2=CONCAT(v1,v2) -- /*... 

其中V1,V1是静态的,那么MySQL必须先调用后缓存CONCAT的结果。 如果v1是字段,则Mysql必须在第一次调用后缓存concat的结果,但仅限当前行。

那么,Mysql这样做?

回答

1

不,MySQL不缓存函数调用。

此外,这样的优化不值得。注意微小的差异:

mysql> SELECT city, country, CONCAT(city, country) FROM cities LIMIT 263000,5 
+----------+---------+-----------------------+ 
| city  | country | CONCAT(city, country) | 
+----------+---------+-----------------------+ 
| Kitanzi | cg  | Kitanzicg    | 
| Masend | cg  | Masendcg    | 
| Chilute | ao  | Chiluteao    | 
| Khilule | ao  | Khiluleao    | 
| Tchibuti | ao  | Tchibutiao   | 
+----------+---------+-----------------------+ 
5 rows in set (0.10 sec) 

mysql> SELECT city, country FROM cities LIMIT 263000, 5; 
+----------+---------+ 
| city  | country | 
+----------+---------+ 
| Kitanzi | cg  | 
| Masend | cg  | 
| Chilute | ao  | 
| Khilule | ao  | 
| Tchibuti | ao  | 
+----------+---------+ 
5 rows in set (0.09 sec) 

获取行比表达式中的任何函数调用都要昂贵。

但是,您可以使用@variables自行执行缓存。再一次,你不会获得太多的速度,如果有的话。 (但是,您可能会在代码中获得简单性。)

+0

关于如何解释此行为的任何想法:'select rand(1),rand(1)from dual where rand(1)= 0.40540353712197724' - http:// rextester.com/LNMRH88059? –

+0

'RAND()'和'RAND(值)'是不同的。前者总是给出不同的随机数;后者将“价值”转换为随机的东西 - 但是可重复的。 –

+0

里克,我正在寻找一种方法来验证或无效您的陈述。所以我的问题是:为什么'RAND(1)'即使在WHERE子句中也为[每行]返回相同的值(http://rextester.com/FIQM84485)。但是我现在认为'RAND(1)'的行为与缓存没有任何关系。 –