En MySQL existe un parámetro que habilita el registro de las consultas que tardan mas de x segundos en ejecutarse, las llamadas Slow Queries. Básicamente lo que hace es meterlas en un fichero de log para luego consultarlo con mysqldumpslow. Este mecanismo nos puede ser útil para mejorar el rendimiento global de la base de datos si reducimos el valor de forma progresiva para los tiempos de ejecución "no admitidos" antes de declarar una consulta como "lenta" o slow query.
Para activarlo debemos:
- Comprobar que no este ya activo desde el cliente mysql
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 77
Server version: 5.0.32-Debian_7etch11-log Debian etch distributionType 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show variables like '%slow%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| log_slow_queries | OFF |
| slow_launch_time | |
+-------------------------+-----------+
2 rows in set (0.00 sec) - Modificar el fichero de configuración my.cnf (normalmente en /etc/mysql/my.cnf), descomentando los siguientes parámetros.
[mysqld]
log-slow-queries=/var/log/mysql-slow-queries.log
long_query_time = 1
log-queries-not-using-indexes
- Creamos el fichero de log y reiniciamos el servidor.
#touch /var/log/mysql-slow-queries.log
#chown mysql.root /var/log/mysql-slow-queries.log
#/etc/init.d/mysql stop
#/etc/init.d/mysql start
- Comprobamos que el cambio se haya realizado correctamente:
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 77
Server version: 5.0.32-Debian_7etch11-log Debian etch distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show variables like '%slow%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| log_slow_queries | ON |
| slow_launch_time| 1 |
+-------------------------+-----------+
2 rows in set (0.00 sec)
Para consultarlo podemos usar mysqldumpslow -t x [fichero], donde x es el tiempo mínimo de la consulta. Ejemplo:
# mysqldumpslow /var/log/mysql/mysql-slow.log
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 1 Time=9.00s (9s) Lock=0.00s (0s) Rows=459887.0 (459887), root[root]@localhost select * from table1
Usando esta herramienta también detectaremos las “malas artes” de algunos cuando construyen sus consultas... o también podemos completar nuestro checklist diario y anexarlo. Más info aquí sobre slow querys.