Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql可以用相同的参数缓存对相同函数的调用吗_Mysql_Query Optimization - Fatal编程技术网

Mysql可以用相同的参数缓存对相同函数的调用吗

Mysql可以用相同的参数缓存对相同函数的调用吗,mysql,query-optimization,Mysql,Query Optimization,例如,我有这个条件 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, c

例如,我有这个条件

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自己进行缓存。同样,你不会获得太多,如果有的话,速度。但是,您可能会获得代码的简单性。

关于如何解释此行为的任何想法:从dual中选择rand1,rand1,其中rand1=0.40540353712197724-?RAND和RANDvalue是不同的。前者总是给出不同的随机数;后者将值转换为随机值,但可以重复。瑞克,我正在寻找一种方法来验证或使您的语句无效。所以我的问题是:为什么RAND1即使在WHERE子句中也返回相同的值。然而,我现在相信RAND1的行为与缓存无关。-使用常量初始值设定项,在执行之前,在编译语句时初始化种子一次。如果使用非恒定初始值设定项(如列名)作为参数,则种子将使用每次RAND调用的值进行初始化。这意味着对于相等的参数值,RAND每次都返回相同的值。。。某些函数(如NOW)故意在每条语句中只计算一次。我想RAND1属于这一类。