/ / Can Mysql buforuje wywołania do tej samej funkcji z tymi samymi argumentami - mysql, optymalizacja zapytań

Czy Mysql może buforować wywołania do tej samej funkcji z tymi samymi argumentami - mysql, optymalizacja zapytań

Na przykład mam ten warunek

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

gdzie v1, v1 są statyczne, Mysql musi buforować wynik concat po pierwszym wywołaniu. Jeśli v1 jest polem, Mysql musi buforować wynik concat po pierwszym wywołaniu, ale tylko dla bieżącego wiersza.

Więc Mysql to robi?

Odpowiedzi:

1 dla odpowiedzi № 1

Nie, MySQL nie buforuje wywołań funkcji.

Ponadto taka optymalizacja nie byłaby warta zrobienia. Zwróć uwagę na małą różnicę:

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)

Pobieranie wierszy jest bardziej kosztowne niż jakiekolwiek wywołania funkcji w wyrażeniach.

Możesz jednak użyć @variables do samodzielnego buforowania. Ponownie, nie zyskasz dużo, jeśli w ogóle, prędkości. (Możesz jednak zyskać na prostocie w kodzie).