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.
Respuestas:
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:
fuente
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
SELECT *
yselect *
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.