slow queries con mysql
A veces una forma de mejorar el rendimiento de una base de datos, cuando el número de posibles consultas es muy vasto o cuando no hemos participado en el desarrollo de las mismas, es observar la base de datos en funcionamiento. mysql ofrece una serie de herramientas para detectar estos problemas como pueden ser las famosas slow-querys así que vamos a aprovechar esta funcionalidad. En principio es un truco para debian pero supongo que se puede modificar para otros
Lo primero que vamos a cambiar es el fichero de configuración de mysql el my.cnf, antes de nada quiero avisar que activar estas opciones supone una perdida de rendimiento apreciable así que tú mismo con tu mecanismo, para un sitio bien dimensionado no representa mayor problema.
log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 2 log-queries-not-using-indexes
Con esto estamos activando las slow_queries con un tiempo de ejecución más bajo del normal, 2 segundos en vez de los 15, además estamos guardando un regist ro de las consultas que no están empleando índices, uno de los factores que más ayuda a mejorar los tiempos de respuesta. A partir de ahora tenemos un regi stro completo de dichas consultas, de vez en cuando me pongo un tail -f para ir viendo si hay algo, pero una solución más eficiente es usar la herramienta mysqldumpslow
mysqldumpslow nos interpreta toda esta información y nos la presenta ordenada por los criterios que queramos, tiempo de ejecución, número de columnas, núme ro de consultas... pero la característica fundamental de esta herramienta es que nos agrupa las sentencias omitiendo de forma completa los argumentos de bu squeda. Un ejemplo, tomemos las siguientes dos consultas de un slow log
# Query_time: 3.00s Lock_time: 0 Rows_sent: 0 Rows_examined: 1197 SELECT * FROM foobar WHERE id="foo"; # Query_time: 3.50s Lock_time: 0 Rows_sent: 0 Rows_examined: 1197 SELECT * FROM foobar WHERE id="bar";
el programa va a considerar que estas dos consultas son la misma y nos presentará la información compactada, mostrando individuales y agrupados para la con sulta y presentando el argumento variable como 'S', es decir, un string.
Count: 2 Time=3.50s (6.50s) Lock=0.00s (0s) Rows=1197 (2396) SELECT * FROM foobar WHERE id='S';
Pues con esto casi lo tenemos todo, ahora una pequeña guinda. Vamos a modificar el logrotate para que cada día me envie al correo las 10 consultas más tard onas, leyendo los datos de los logs antes de rotarlos. Para esto tenemos que ir al fichero /etc/logrotate.d/mysql-server y vamos a modificarlo añadiendo un a serie de tareas en el prerotate.
prerotate mysqldumpslow -t 10 /var/log/mysql/mysql-slow.log | mail -s "mysql slow logs" mi_email@example.com otro_admin@example.com endscript
Muy sencillo, antes de rotar, hazme un top 10 (-t 10) de las consultas más lentas y me lo envias con subject mysql slow logs a mi dirección de correo y a l a del otro admin por si quiere echar un vistazo.