¿MySQL almacena en caché las consultas?

19

Estoy interconectando una base de datos MySQL con PHP Data Objects (PDO) y ejecutando una extensa consulta SQL. Normalmente, tarda unos 1500 ms; Todavía necesito optimizarlo. Cuando ejecuto el script PHP dos veces con un breve intervalo intermedio, la consulta solo tarda unos 90 ms. La consulta es en ambos casos la misma. Cuando ejecuto el script, con la misma consulta, después de algún tiempo nuevamente, toma 1500 ms nuevamente.

¿Porqué es eso? ¿La base de datos se almacena en caché automáticamente? ¿Hay algún momento en que la base de datos guarda el caché y luego lo elimina automáticamente?

Supongo que PHP no puede almacenar en caché los resultados, porque esto sucede en dos hilos diferentes. No creo que PHP guarde en caché los resultados, porque no puede saber si la base de datos ha cambiado.

Tengo un script que se ejecuta cada minuto para insertar nuevas filas en la base de datos. Esta también podría ser la razón por la que tarda 1500 ms nuevamente después de un tiempo; la caché se habría eliminado, porque las tablas relevantes ya no son las mismas.

Peter Mortensen
fuente
Muéstrame tu código No necesito tu consulta, solo una forma de cómo la estás probando.
3
Sí, mySQL almacena en caché las consultas. Es inteligente así.
@Kasyx qué código? Es solo PDO básico, pero no creo que PHP pueda almacenarlo en caché porque ejecuto el script PHP dos veces, no ejecuto la consulta dos veces en un script. ¿También podría explicar por qué editó pdo mientras no es realmente relevante para la pregunta?
3
Todos los DBMS tienen un caché de nivel de página de algún tipo. Muchos van más allá al almacenar en caché los planes de ejecución de consultas o incluso los resultados de consultas (incluido MySQL ). Sospecho que esto último es el principal culpable de su comportamiento observado.
Branko Dimitrijevic
¿Estás haciendo inserciones cada minuto? ¡Resuelve eso primero!
Grant Thomas

Respuestas:

15

Es probable que sea un artefacto de la caché de consultas MySQL .

Ejecutas la consulta SQL, MySQL almacena en caché su resultado y la próxima ejecución si es rápido. Cuando ejecuta el script para insertar los datos en las tablas a las que hace referencia su consulta, la caché de resultados se invalida y la consulta debe ejecutarse "de verdad" la próxima vez.

De la documentación de MySQL vinculada anteriormente:

Es mucho más probable que una combinación de consultas que consiste casi en su totalidad en un conjunto fijo de instrucciones SELECT se beneficie al habilitar la memoria caché que una combinación en la que las instrucciones INSERT frecuentes provocan la invalidación continua de los resultados en la memoria caché.

Branko Dimitrijevic
fuente
5

Sí, mySQL (en común con todos los demás productos de bases de datos populares) almacena en caché las consultas que se le hacen.

El almacenamiento en caché es bastante inteligente: a menudo puede usar un caché para una consulta, incluso si los parámetros exactos de la consulta no son los mismos. Esto puede hacer una gran diferencia en el rendimiento.

El almacenamiento en caché se controla completamente dentro del software del servidor DB; no tiene visibilidad de lo que contiene el caché, ni cuánto tiempo permanece un elemento determinado en el caché; podría sobrescribirse en un momento dado dependiendo de cómo se llamen otras consultas, etc. Está ahí para ayudar al rendimiento, pero no se debe confiar en él para el rendimiento.

Puede leer más sobre esto aquí en el manual de MySQL .

Además, el uso de PDO le permite escribir sus consultas como "declaraciones preparadas", vinculando los parámetros en lugar de codificarlos en una cadena de consulta de texto sin formato. Esto también tiene implicaciones de almacenamiento en caché en el servidor de base de datos y para las consultas que se repiten, también mejorará el rendimiento.


fuente
2
"A partir de MySQL 5.1.17, el caché de consultas se usa para declaraciones preparadas en las condiciones descritas en la Sección 8.6.3.1," Cómo funciona el caché de consultas ". Antes de 5.1.17, el caché de consultas no se usa para declaraciones preparadas". dev.mysql.com/doc/refman/5.1/en/query-cache.html
1
" en común con todos los demás productos de bases de datos populares ": eso es un poco engañoso. Casi ningún DBMS almacena en caché los resultados de las consultas como lo hace MySQL. DBMS por lo general sólo tabla de caché (o índice) de datos , no resultados de consulta . La mayoría de ellos almacenan en caché el plan de ejecución de la consulta (y la consulta "fuente")
a_horse_with_no_name
3
"a menudo puede usar un caché para una consulta, incluso si los parámetros exactos de la consulta no son los mismos" es completamente incorrecto. La consulta debe ser byte por byte idéntica a una consulta previamente ejecutada y aún en caché para poder ser atendida desde la caché. Incluso la diferencia entre SELECT *y select *significa que una consulta idéntica no se atenderá desde la memoria caché. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Enlace 5.1 publicado por coherencia, pero se aplica a todas las versiones.
Michael - sqlbot