例如我有这个条件
WHERE f1=CONCAT(v1,v2) OR f2=CONCAT(v1,v2) -- /*...
其中v1,v1是静态的,那么Mysql必须在第一次调用后缓存concat的结果。 如果v1是field,那么Mysql必须在第一次调用后缓存concat的结果,但仅限于当前行。
那么,Mysql这样做了吗?
答案 0 :(得分:2)
不,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自行进行缓存。再一次,你获得了很多(如果有的话)速度。 (但是,您可能会在代码中获得简单性。)