Optimizando Mysql con SQL_NO_CACHE y SQL_CACHE

Una de las razones por las que Mysql se ha distinguido en sus tiempos de respuesta es el manejo de una caché de consultas. Esta caché la usa Mysql para almacenar tanto las sentencias como sus resultados permitiendo que al serle requerido el mismo conjunto de datos con la misma sentencia sql puede tomar el caché sin tener que recurrir a las tablas en si.  Este comportamiento es sumamente útil donde se genera contenido a partir de ambientes con muy baja transaccionalidad.  Es precisamente por esta ventaja que Mysql viene con el caché habilitado por default desde la instalación.

De acuerdo a lo que nos dice la documentación sobre Query Cache, las sentencias SQL así como sus resultados se mantendrán en memoria hasta que ocurra un cambio, por mínimo que sea, en las tablas involucradas. Esto en un ambiente de baja transaccionalidad suena muy bien pues le ahorra al motor de base de datos tener que realizar operaciones de lectura sobre grandes volúmenes de datos y por el contrario obtener mejores tiempos de respuesta al recurrir a la caché con resultados ya procesados.

¿Pero que sucede en ambientes donde se registran muchas operaciones de escritura en la base de datos? Bueno, debido a que cada cambio en las tablas provocará la eliminación del caché, tendremos un ambiente donde el servidor constantemente borrará el caché, ejecutará la sentencia SQL y volverá a crear el conjunto de datos en el caché. Esto multiplicado por la cantidad de operaciones de escritura que haya en las tablas. Es en este tipo de ambientes donde corremos el riesgo de que nuestro servidor comience a degradarse y a mostrar constantes “storing result in query cache” como podemos ver en la siguiente imagen:

storing result in query cache 

Una solución rápida para este problema sería desactivar el query caché en nuestro servidor de base de datos y de esa manera evitar que de manera continua el servidor esté almacenando y borrando el caché. Lo malo de esta solución es que si se tienen tablas con baja transaccionalidad se desperdiciarían las grandes ventajas del caché de MYSQL.

Otra solución sería la de aumentar el tamaño del caché en MYSQL que aunque probablemente solucione el problema en el corto plazo, solo estará postergando una solución efectiva a este problema que reincidirá conforme el volumen de información en las tablas aumente.

Una solución óptima sería decirle a MYSQL que puede o no enviar al caché. Para ello se nos proporcionan las sentencias SQL_CACHE y SQL_NO_CACHE. Con estas sentencias podemos optimizar los tiempos de respuesta de nuestro servidor SQL desactivando el caché en consultas que involucren tablas con alta transaccionalidad y habilitándolo para aquellas donde los datos son poco modificados.

El uso de SQL_NO_CACHE y SQL_CACHE sería:

  SELECT SQL_NO_CACHE CAMPO1,CAMPO2,..,CAMPON
    FROM TABLA;

  SELECT SQL_CACHE CAMPO1,CAMPO2,..,CAMPON

    FROM TABLA;

Esto nos garantiza un mejor rendimiento de nuestro servidor al ahorrarle trabajo innecesario. La documentación puede consultarse en:    http://dev.mysql.com/doc/refman/5.0/es/query-cache-in-select.html 

Si deseas conocer más acerca del uso de caché puedes leer más aquí: http://dev.mysql.com/doc/refman/5.0/es/query-cache.html

 

Sé el primero en comentar

Deja un comentario