mitago.net

Página web de Celso González

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.

vie 30 mayo 2008 00:000 comentarios