MySQL memorizza nella cache?


19

Sto interfacciando un database MySQL con PHP Data Objects (PDO) ed eseguendo una query SQL estesa. Normalmente, ci vogliono circa 1500 ms; Devo ancora ottimizzarlo. Quando eseguo lo script PHP due volte con un breve intervallo tra, la query richiede solo circa 90 ms. La query è in entrambi i casi la stessa. Quando eseguo lo script, con la stessa query, dopo qualche tempo, ci vogliono ancora 1500 ms.

Perché? Il database memorizza automaticamente nella cache? C'è un po 'di tempo in cui il database salva la cache e poi la elimina automaticamente?

Presumo che i risultati non possano essere memorizzati nella cache da PHP, perché ciò accade in due thread diversi. Non credo che PHP memorizzerebbe nella cache i risultati, perché non può sapere se il database è cambiato.

Ho uno script in esecuzione ogni minuto per inserire nuove righe nel database. Questo potrebbe anche essere il motivo che impiega di nuovo 1500 ms dopo qualche tempo; la cache sarebbe stata eliminata, perché le tabelle pertinenti non sono più le stesse.


Mostrami il tuo codice. Non ho bisogno della tua domanda, solo un modo in cui la stai testando.

3
Sì, le query nella cache mySQL. È così intelligente.

@Kasyx quale codice? È solo un PDO di base, ma non credo che PHP possa memorizzarlo nella cache perché eseguo lo script PHP due volte, non eseguo la query due volte in uno script. Potresti anche spiegare perché hai modificato pdo mentre non è realmente rilevante per la domanda?

3
Tutti i DBMS hanno una cache a livello di pagina di qualche tipo. Molti vanno oltre, memorizzando nella cache i piani di esecuzione delle query o persino i risultati delle query (incluso MySQL ). Sospetto che quest'ultima sia la principale colpevole del tuo comportamento osservato.
Branko Dimitrijevic,

Stai facendo inserti ogni minuto? Ordina che la prima fuori!
Concedi Thomas il

Risposte:


15

Questo è probabilmente un artefatto della cache delle query di MySQL .

Esegui la query SQL, MySQL memorizza nella cache il risultato e l'esecuzione successiva se veloce. Quando si esegue lo script per inserire i dati nelle tabelle a cui fa riferimento la query, la cache dei risultati viene invalidata e la query deve essere eseguita "per davvero" la volta successiva.

Dalla documentazione MySQL collegata sopra:

Un mix di query costituito quasi interamente da un set fisso di istruzioni SELECT è molto più probabile che tragga beneficio dall'abilitazione della cache rispetto a un mix in cui frequenti istruzioni INSERT causano la continua invalidazione dei risultati nella cache.


5

Sì, mySQL (in comune con tutti gli altri prodotti di database popolari) memorizza nella cache le query che vi vengono fatte.

La memorizzazione nella cache è piuttosto intelligente: spesso può utilizzare una cache per una query anche se i parametri esatti della query non sono gli stessi. Questo può fare una grande differenza nelle prestazioni.

La memorizzazione nella cache è controllata interamente all'interno del software del server DB; non hai alcuna visibilità di ciò che contiene la cache, né per quanto tempo un dato elemento rimane nella cache; potrebbe essere sovrascritto in qualsiasi momento a seconda di quali altre query vengono chiamate, ecc. È lì per aiutare le prestazioni, ma non dovrebbe essere invocato per le prestazioni.

Puoi leggere di più qui nel manuale di MySQL .

Inoltre, l'utilizzo di PDO consente di scrivere le query come "istruzioni preparate", vincolando i parametri anziché codificandoli in una stringa di query di testo semplice. Ciò ha anche implicazioni nella memorizzazione nella cache sul server DB e, per le query ripetute, migliorerà anche le prestazioni.


2
"A partire da MySQL 5.1.17, la cache delle query viene utilizzata per le istruzioni preparate nelle condizioni descritte nella Sezione 8.6.3.1," Funzionamento della cache delle query ". Prima della 5.1.17, la cache delle query non viene utilizzata per le istruzioni preparate." dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
" in comune con tutti gli altri prodotti di database popolari ": è un po 'fuorviante. Quasi nessun DBMS memorizza attivamente nella cache i risultati delle query come fa MySQL. In genere DBMS memorizza solo nella cache (o nell'indice) i dati , non i risultati della query . Molti di loro memorizzano nella cache il piano di esecuzione della query (e la query "origine")
a_horse_with_no_name

3
"spesso può utilizzare una cache per una query anche se i parametri esatti della query non sono gli stessi" è completamente errato. La query deve essere identica a byte per byte identica a una query precedentemente eseguita e ancora memorizzata nella cache per poter essere pubblicata dalla cache. Anche la differenza tra SELECT *e select *significa che una query altrimenti identica non verrà servita dalla cache. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Link postato 5.1 per coerenza, ma si applica a tutte le versioni.
Michael - sqlbot l'
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.