Pregunta Cachear resultados de la base de datos - necesita un empujón sobre cómo empezar


Tengo un proyecto que viene donde uno de los requisitos será almacenar en caché lo que esencialmente son datos de solo lectura para disminuir la tensión en la db. Estoy un poco confundido sobre cómo funciona el almacenamiento en caché con un db.

Cómo hace trabajo de almacenamiento en caché? He visto algo llamado consulta de caché, pero hace esa consulta de caché resultados? ¿O simplemente las consultas? ¿Y no es una vista una forma de almacenamiento en caché de todos modos?

Sólo estoy buscando un empujón en la dirección correcta. El proyecto utilizará MySQL 5.1 para la tienda, por lo que cualquier enlace que pueda aclarar mi confusión sería de gran ayuda. Una búsqueda general en Google solo me ha proporcionado el caché de consultas, y debido a mi falta de conocimiento en esta área, no estoy seguro de cuál es la dirección a la que debo ir.


6
2017-12-07 20:37


origen




Respuestas:


El caché de consultas de MySQL de hecho, almacena en caché los resultados de la consulta y mientras las consultas posteriores sean exactamente iguales, se proporcionará el resultado calculado en lugar de ejecutar la consulta. MySQL también omitirá el cálculo del plan de ejecución.

Para usarlo, puedes o bien encenderlo en su servidor my.cnf o usa el SQL_CACHE insinuar delante de sus consultas. Si lo tiene activado en my.cnf, puede decirle a MySQL que no almacene en caché un resultado usando SQL_NO_CACHE delante de sus consultas.

Cualquier escritura (INSERTAR, ACTUALIZAR, BORRAR, etc.) en una tabla invalidará todas las entradas en el caché de consulta que provino de esa tabla.

Una anomalía de rendimiento con el caché de consulta: utiliza un algoritmo ineficiente para encontrar entradas dentro del caché, por lo que crear un caché más grande puede resultar en un peor rendimiento. Debería experimentar con cambiarlo con sus propios datos y perfiles de consulta, pero la última vez que realicé este experimento descubrí que alrededor de 256 MB era el punto ideal. Más grande o más pequeño que esto y el rendimiento empeoró. El manual sugiere "Decenas de megabytes"

También puede implementar el almacenamiento en caché fuera de MySQL usando algo como memcached. Esto no es transparente para la aplicación, por lo que tendrá que agregar un código adicional en la aplicación para manejar la búsqueda en memcached y luego, si se omite, hacer la búsqueda en la base de datos y almacenar el resultado en memcached.


8
2017-12-07 20:49



Impresionante, exactamente lo que estaba buscando. Daría otro +1 por la advertencia sobre el rendimiento. - Major Productions


Podrías hacer esto de varias maneras. Probablemente hay otras formas de hacerlo, pero estas 2 vienen a la mente al instante.

Podría crear otra tabla para guardar los resultados almacenados en caché y, de forma programada, ejecutar las consultas costosas que podrían unirse a varias tablas con un montón de registros en ellos y volcar los registros en esta tabla. Haciendo un SELECT * desde una sola tabla debería ser menos costoso que hacer un SELECTO que une 12 tablas diferentes, cada una con millones de registros en ellas. Si bien esto no elimina exactamente el trabajo del servidor de base de datos, debería reducir la carga de trabajo computacional al tener que hacer solo las consultas costosas en un horario y hacer que sus clientes habituales obtengan datos de la tabla de caché.

Alternativamente, para un caché que sea totalmente independiente de su base de datos, podría implementar algo como Redis. Esto almacenará los datos en la memoria y debería ser súper rápido, pero necesitará algo de lógica adicional en su aplicación para usar esto como fuente de datos en lugar de la base de datos real. También se adapta bien: la red de Stack Exchange lo utiliza con bastante eficacia en sus sitios.


3
2017-12-07 20:53



Bonito. No preveo tener millones de registros o la necesidad de múltiples bases de datos para este proyecto, pero es bueno tener otro enfoque en mi caja de herramientas para cuando lo haga. - Major Productions
Esto también puede funcionar bien en los casos en que tanto el caché de consultas como el memcached sean inapropiados. Hackeé algo como esto en un software de foro hace unos años para almacenar en caché las publicaciones "calientes". La tabla de caché terminó siendo solo alrededor de 20k filas. Era demasiado para caber en memcached y la memoria caché de consulta para la tabla de publicaciones principales se habría invalidado cada pocos segundos. - Ladadadada