MySQL, Acelerar GROUP BY

En el sistema de mensajes SMS tenia una consulta SQL que tardaba demasiado, y buscando el porqué me di cuenta que el causante es la sentencia GROUP BY, ahora bien, investigando sobre esta clausula me doy cuenta que cuando uno tiene muchos registros se pone tremendamente lenta!!!, y para ello una muestra,

Tengo una tabla con 542,000 registros, y al hacer una consulta con el GROUP BY me tardaba aproximadamente 8.7seg, casi 9 segundos, y pues como solo necesitaba 1 resultado que es el que tenia en el GROUP BY, pues tenia que encontrar la forma rapida de sacar esta información, eliminando los duplicados.

Así que hice varias pruebas.

Sentencia con: GROUP BY, LIMIT tardaba 8.7 seg
Sentencia con: GROUP BY, ORDER BY, LIMIT tardaba 8.3 seg
Sentencia con: LIMIT tardaba 1.1 seg (solo que me podia repetir valores)
Sentencia con: DISTINCT, LIMIT tardaba 1.2 seg < – CON ESTA ME QUEDO!!!!

Si pueden ver, la diferencia es muy notable! entre poner un group by, sin group by y con el distinct, claro que todo depende de la informacion que saquemos, las relaciones de tablas, etc, etc…, pero bueno!!, hoy aprendi algo nuevo.

Aquí les dejo algunos tips que encontre para acelerar el GROUP BY, aunque en mi caso seguia siendo lento aplicando estas tecnicas:

* Mantener el número de fílas a devolver por la QUERY tan pequeño como sea posible
* Mantener el número de agrupaciones tan limitado como sea posible
* No agrupar columnas redundantes
* Si hay un JOIN en la misma SELECT que tiene un GROUP BY, intentar reescribir la QUERY usado una SUBQUERY en lugar de usar un JOIN. Si es posible hacer esto, el rendimiento sera major. Si se tiene que usar un JOIN, intentaremos hacer el GROUP BY por columna desde la misma tabla que la columna o columnas sobre la cual la se usa la función.
* Consideraremos el añadir un ORDER BY a la SELECT que ordena por la misma columna que el GROUP BY. Eso puede producir que el GROUP BY tenga mejor rendimiento.

Y aquí pueden ver información sobre optimización de MySQL para grandes tablas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *