1
例如,我有这个条件能Mysql的缓存调用相同功能与相同参数
WHERE f1=CONCAT(v1,v2) OR f2=CONCAT(v1,v2) -- /*...
其中V1,V1是静态的,那么MySQL必须先调用后缓存CONCAT的结果。 如果v1是字段,则Mysql必须在第一次调用后缓存concat的结果,但仅限当前行。
那么,Mysql这样做?
例如,我有这个条件能Mysql的缓存调用相同功能与相同参数
WHERE f1=CONCAT(v1,v2) OR f2=CONCAT(v1,v2) -- /*...
其中V1,V1是静态的,那么MySQL必须先调用后缓存CONCAT的结果。 如果v1是字段,则Mysql必须在第一次调用后缓存concat的结果,但仅限当前行。
那么,Mysql这样做?
不,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自行执行缓存。再一次,你不会获得太多的速度,如果有的话。 (但是,您可能会在代码中获得简单性。)
关于如何解释此行为的任何想法:'select rand(1),rand(1)from dual where rand(1)= 0.40540353712197724' - http:// rextester.com/LNMRH88059? –
'RAND()'和'RAND(值)'是不同的。前者总是给出不同的随机数;后者将“价值”转换为随机的东西 - 但是可重复的。 –
里克,我正在寻找一种方法来验证或无效您的陈述。所以我的问题是:为什么'RAND(1)'即使在WHERE子句中也为[每行]返回相同的值(http://rextester.com/FIQM84485)。但是我现在认为'RAND(1)'的行为与缓存没有任何关系。 –