martes, 4 de noviembre de 2008

Consulta que esta corriendo mysql

Si tenemos un servidor en el que esta corriendo mysql (yo las pruebas fueron sobre un Linux pero supongo que no hay problema si se hacen en uno bajo windows por ejemplo) y se están corriendo proceso que no sabemos bien cual es la consulta que esta haciendo, con el siguiente comando la podemos detectar.




show full processlist;




para esto tenemos que loguearnos por consola de mysql, y luego ejecutar la consulta.


Esto lo que nos tira es la consulta que se esta haciendo ejemplo


"Select ... from ... where ... order by ..." o lo que sea que se este ejecutando en ese instante.




Yo lo utilizo para detectar las consultas que hace genexus, no se si todos saben lo que es genexus, pero sirve para desarrollar aplicaciones, sin tener que estar pensando tanto en la base de datos (ya se que es un muy mal ejemplo de que es genexus, y se que gx es mucho mas que eso, pero sirve para entender la idea), es decir el solo te arma las consultas sql cuando accedes a cualquier base de datos.




Como entre a investigar esto, bueno teníamos una tabla en la que había mas de 100 millones de registros y hacíamos una consulta por un índice que tenia un dato, el ultimo, la clave primaria de la tabla, mientras que tenia 2 campos antes que si mysql filtraba por esos 2 debería de devolver unos pocos registros, menos de 500 seguro, y la consulta demoraba mucho, mas de 20 minutos, analizando lo que pasa es que mysql si tiene en algún índice en el que tenga por casualidad la clave de la tabla, mysql se recorre toda la tabla.


Un ejemplo para que quede mas claro




tabla facturas


código,.....,estado,...,dueño,....,




los puntos dicen que ahí hay muchos mas campos.




índice por el cual debería de recorre, estado,dueño,código


la clave primaria, solo código.


Si filtramos los datos de la tabla por estado, dueño, no trae 500 registros.




select * from facturas where estado = 'pendiente' and dueño = 'pepe' esto anda muy rápido, pero si se pone order by estado,dueño,código, demora mucho mucho.


Pero si sacamos el ultimo campo, es decir order by estado,dueño, esto es casi instantáneo.




Luego de googlear mucho detectamos este (digamoslo asi) bug de mysql.




Entonces, no pongan índices en sus aplicaciones que tengan entre sus integrantes la clave primaria.



Volver al inicio

No hay comentarios: