Dicho y hecho, hemos agregado el nuevo servicio de reporte sobre las consultas SQL de tus bases de datos.

Antes de entrar en detalle quiero señalar que desde el equipo de Desarrollo estamos profundamente indignados con la cantidad de respuesta que tuvo el post anterior respecto de los 3 comentarios que nos dejaron en el prelanzamiento de estos nuevos reportes. Qué pasó con los tecnófilos ?

En fin.

Los molesto con que ingresen a su GridPanel y miren la sección MySQL -> Registro de Consultas. Se van a encontrar con un listado día a día, base por base, de todas las consultas SQL que sus sitios hayan ejecutado que hayan superado 1 segundo de ejecución. Pueden ver varios datos asociados a cada consulta, realizar búsquedas por cualquier cadena de texto y lo que es mejor la información se actualiza una vez por minuto, no luego de varias horas.

Cada segundo que ven ahí es un segundo que sus usuarios tuvieron que esperar así que es una excelente herramienta para optimizar un sitio!

Una guia muy rápida de como optimizar una consulta SQL

Imagínense una base de datos como una estantería llena de libros. Cada libro de la estantería es una tabla.
Cada página del libro es un registro (a fines prácticos, sepan que esto es solo una analogía)

Si les pido que me busquen en qué página empieza el capítulo 2 del libro una forma es abrirlo, y mirar página por página, una por una, hasta encontrar una página que diga “CAPITULO 2″. Me van a decir, el capitulo 2 empieza en la página 40.

Ahora bien, lo más probable es que el libro tenga un índice al principio y mirando solamente el índice y sin mirar el resto del libro me puedan decir también que el capitulo 2, efectivamente empieza en la página 40.

Cuando trabajamos con bases de datos el concepto es exactamente el mismo. Si guardamos muchos registros (páginas), tengamos presente que cuando le pedimos al motor de MySQL que nos traiga un resultado va a tener que leer página por página, la tabla (libro) entero hasta encontrar todo lo que le pedimos.

Pero si armamos un índice, los resultados van a ser mucho más rápidos!

La gran mayoría de las consultas que van a encontrar en el Slow Query Log de MySQL tienen que ver con esto. No siempre, pero diría que un 95% de los casos. Y muchas veces un pequeño indice en una columna de datos determinada puede generar enormes diferencias. Hoy mismo trabajamos con un cliente para reducir una consulta de 180 segundos a 0.01 segundos con 2 índices!

Entonces lo que tenemos que hacer es:

1. Identificar las consultas lentas (esto lo hacemos por vos ;)
2. Ejecutar la consulta anteponiendo la cláusula EXPLAIN.

Por ejemplo si la consulta es “SELECT * FROM usuarios WHERE cumpleanos = ’2008-25-10′
Ejecutamos lo siguiente: “EXPLAIN SELECT * FROM usuarios WHERE cumpleanos = ’2008-25-10′

Nos va a dar algo parecido a:

+–+————+———-+——+—————+——-+——–+——-+——-+————-+
| id | select_type | table        | type  | possible_keys | key      | key_len | ref      | rows    | Extra             |
+–+————+———-+——+—————+——-+——–+——-+——-+————-+
|  1 | SIMPLE      | usuarios   | ALL  | NULL               | NULL |    NULL | NULL | 19063 | Using where |
+–+————+———-+——+—————+——-+——–+——-+——-+————-+

3. Crear los índices adecuados (imaginarse: que columna tendría que leer para filtrar lo que me piden?)

y con un simple “ALTER TABLE usuarios ADD INDEX indice1 (cumpleanos);” la cosa cambia:

+–+————+———-+——+—————+———-+———+——-+—-+————-+
| id | select_type | table        | type  | possible_keys | key            | key_len | ref        | rows    | Extra       |
+–+————+———-+——+—————+———-+———+——-+—-+————-+
|  1 | SIMPLE      | usuarios   | ref     | indice1             | indice1      |           8   | const    | 1     | Using where |
+–+————+———-+——+—————+———-+———+——-+—-+————-+

Si se fijan van a ver que la cantidad de registros (rows/páginas) analizadas pasó de 19063 (la cantidad de usuarios que tengo a 1. Mucho, pero mucho más rápido.

4. Probar nuevamente con un EXPLAIN. Si los resultados no son satisfactorio pueden eliminar el índice mediante el comanto ALTER TABLE usuarios DROP INDEX indice1.

Con estos pasos van a lograr que sus sitios funcionen mucho más rápido. Y si sus registros de consultas lentas están vacíos, quiere decir que están haciendo las cosas bien :) (o que las tablas son muy chicas!)

Hay muchas herramientas para este tipo de tareas como el esta, esta o esta otra.

Eso es todo!

pd. Estamos trabajando ahora en una actualización general de todas las instalaciones de PHP en versión 4 y versión 5 en todos nuestros servidores. Vamos a incluir nuevos módulos, límites de memoria y upload más amplios y la posibilidad de elegir entre varias configuraciones php.ini diferentes. Estén atentos para dentro de poco :)