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)'的行爲與緩存沒有任何關係。 –