2015-09-26 157 views
1

例如,我有這個條件能Mysql的緩存調用相同功能與相同參數

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

其中V1,V1是靜態的,那麼MySQL必須先調用後緩存CONCAT的結果。 如果v1是字段,則Mysql必須在第一次調用後緩存concat的結果,但僅限當前行。

那麼,Mysql這樣做?

回答

1

不,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自行執行緩存。再一次,你不會獲得太多的速度,如果有的話。 (但是,您可能會在代碼中獲得簡單性。)

+0

關於如何解釋此行爲的任何想法:'select rand(1),rand(1)from dual where rand(1)= 0.40540353712197724' - http:// rextester.com/LNMRH88059? –

+0

'RAND()'和'RAND(值)'是不同的。前者總是給出不同的隨機數;後者將「價值」轉換爲隨機的東西 - 但是可重複的。 –

+0

裏克,我正在尋找一種方法來驗證或無效您的陳述。所以我的問題是:爲什麼'RAND(1)'即使在WHERE子句中也爲[每行]返回相同的值(http://rextester.com/FIQM84485)。但是我現在認爲'RAND(1)'的行爲與緩存沒有任何關係。 –