MySQL: forzare a non utilizzare la cache per testare la velocità della query


343

Sto testando la velocità di alcune query in MySQL. Il database memorizza nella cache queste query, il che mi rende difficile ottenere risultati affidabili quando collaudo la velocità di queste query.

C'è un modo per disabilitare la memorizzazione nella cache per una query?

Sistema: MySQL 4 su webhosting Linux, ho accesso a PHPMyAdmin.

Grazie

mysql 

Risposte:


527

Prova a utilizzare l' opzione SQL_NO_CACHE (MySQL 5.7) nella tua query. (Gli utenti di MySQL 5.6 fanno clic QUI )

per esempio.

SELECT SQL_NO_CACHE * FROM TABLE

Ciò impedirà a MySQL di memorizzare nella cache i risultati, tuttavia tieni presente che anche altre cache del sistema operativo e del disco potrebbero influire sulle prestazioni. Questi sono più difficili da aggirare.



4
Un bell'articolo sulla cache delle query di mysql. Come configurare e vedere la cache in azione! Vale la pena leggere. databasejournal.com/features/mysql/article.php/3110171/…
Adrian P.

1
Prima di provare a migliorare le prestazioni, prova a riavviare il tuo server mysql. Può darsi che qualche processo stia influenzando tutto. È successo con me Sebbene sia un commento che non ha una connessione diretta con il problema, può aiutare molte persone.
dellasavia,

2
Questo gli impedisce di memorizzare nella cache i risultati ma impedisce anche di usare la cache?
Brett

3
@Brett vede il commento di SalmanPK nel lontano 11. Quella pagina doc è letteralmente 4 frasi e risponde direttamente alla tua domanda. Nel caso in cui la pagina venga rimossa in futuro: "Non controlla la cache della query per vedere se il risultato è già memorizzato nella cache, né memorizza nella cache il risultato della query."
Maurizio

121

Un'altra alternativa che riguarda solo la connessione corrente:

SET SESSION query_cache_type=0;

Colpa mia. E 'stato query_cache_sizestavo guardando, non è query_cache_type. Stavo mescolando la tua e la risposta di SeniorDev.
Mike,


30

C'è anche un'opzione di configurazione: query_cache_size = 0

Per disabilitare la cache delle query all'avvio del server, impostare la variabile di sistema query_cache_size su 0. Disabilitando il codice della cache delle query, non si verificano sovraccarichi evidenti. Se si crea MySQL dall'origine, è possibile escludere del tutto le funzionalità di cache delle query dal server richiamando configure con l'opzione --without-query-cache.

Vedi http://dev.mysql.com/doc/refman/5.1/en/query-cache.html


24

È inoltre possibile eseguire il comando seguente per ripristinare la cache delle query.

RESET QUERY CACHE

9
Questo è probabilmente eccessivo ... idealmente, vuoi solo che MySQL ignori temporaneamente la cache.
BMiner,

3
È inoltre necessario disporre di autorizzazioni speciali per questo.
Erick Robertson,

19

Un problema con il

SELECT SQL_NO_CACHE * FROM TABLE

il metodo è che sembra impedire solo che il risultato della query venga memorizzato nella cache. Tuttavia, se si esegue una query su un database che viene attivamente utilizzato con la query che si desidera verificare, è possibile che altri client memorizzino nella cache la query, influendo sui risultati. Sto continuando a ricercare modi per aggirare questo, modificherò questo post se ne scoprirò uno.


1
Ma se la cache viene riempita da altri, avrai l'illusione di essere veloce. Ma a volte no.
Karatedog,

14

Vorrei usare il seguente:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';

3

L'uso di una variabile definita dall'utente all'interno di una query rende la query ripristinabile invariabile. L'ho trovato un indicatore molto migliore rispetto all'uso SQL_NO_CACHE. Ma dovresti mettere la variabile in un posto dove l'impostazione della variabile non influirebbe seriamente sulle prestazioni:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;

3
"L'ho trovato un indicatore molto migliore rispetto all'uso SQL_NO_CACHE." Come mai? Sembra che avresti bisogno di un caso piuttosto valido per utilizzare un hack oscuro su una parola chiave esplicita, a meno che la parola chiave esplicita non stia facendo ciò che afferma.
Air

1
@Air Ho trovato questa soluzione per funzionare meglio di SQL_NO_CACHE. SQL_NO_CACHE ha funzionato per la prima volta eseguendo la query, ma successivamente non ha funzionato di nuovo. Suppongo che ciò sia dovuto ad altri meccanismi di memorizzazione nella cache. Penso che funzioni meglio perché una ricerca che si basa su una variabile non può essere memorizzata nella cache da alcun livello o meccanismo - almeno, questa è la mia ipotesi migliore.
Klik,

2

Se si desidera disabilitare la cache delle query, impostare "query_cache_size" su 0 nel file di configurazione di mysql. Se il suo set 0 mysql non utilizzerà la cache delle query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.