Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Optimizar Group By

Estas en el tema de Optimizar Group By en el foro de Mysql en Foros del Web. Saludos Podria ayudarme a optimizar esta consulta sin usar group by o distinct mis tablas son algo asi: tabla1 ID DSC 1 aaa 2 bbb ...
  #1 (permalink)  
Antiguo 28/01/2010, 13:18
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 17 años
Puntos: 0
Optimizar Group By

Saludos
Podria ayudarme a optimizar esta consulta sin usar group by o distinct
mis tablas son algo asi:

tabla1
ID DSC
1 aaa
2 bbb
3 ccc
4 ddd
5 eee

tabla2
ID tabla1_ID
t1 1
t2 2
t3 2
t4 2
t5
t6 5
t7 4
t8 4
t9
t10 5

Mi objetivo es que por cada ID de la tabla1 me indique si tiene algun valor o no en tabla1_ID de la tabla2 sin repetir los valores del ID de la tabla1
algo asi:

resultado
ID ID2
1 1
2 3
3 0
4 2
5 2

y mi query es:

SELECT tabla1.*, (tabla2.ID>0) as ID2
FROM tabla1
LEFT JOIN tabla2 ON tabla1.ID = tabla2.tabla1_ID
GROUP BY tabla1.ID

El problema es que me toma mucho tiempo ya que tengo mas de 50 mil registros en aumento.

Se podra hacer algo sin usar GROUP BY o DISTINCT y que tome menos tiempo?
Gracias por las respuestas
  #2 (permalink)  
Antiguo 28/01/2010, 17:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Optimizar Group By

Necesitas agrupar para contar por id. Prueba esto.

Código SQL:
Ver original
  1. SELECT t1.ID, t1.DSC, IFNULL(t3.total,0) totalporID FROM tabla1 t1
  2.  LEFT JOIN (SELECT t2.tabla1_id ID, COUNT(*) total  FROM tabla2 t2 GROUP BY t2.tabla1.id)t3 ON t1.ID = t3.ID

Creo que la lentitud quizás se deba en parte a que no estés indexando los campos que cruzas, es decir, ese tabla1_ID de tabla2
  #3 (permalink)  
Antiguo 28/01/2010, 17:48
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 17 años
Puntos: 0
Respuesta: Optimizar Group By

Gracias por la ayuda.
ese query lo hace mas lento.
Pense en usar subselects, supongo que eso lo hace mas lento porque el resultado es una tabla temporal sin indice.

el campo tabla1_ID de la tabla2 tiene indice INDEX tipo BTREE y el tipo de dato es INT(5)
Se podra hacer algo para mejorar el tiempo en que devuelve los resultados?
  #4 (permalink)  
Antiguo 28/01/2010, 18:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Optimizar Group By

El GROUP BY es, lamentablemente, lo mismo que el ORDER BY, una de las formas más ineficientes de las consultas, tal que es mejor tratar de obtener estos ordenamientos con el uso de índices y no por ordenar las tablas en la consulta.
De todos modos, si lo que quieres es realmente optimizar el GROUP BY o el ORDER BY mi recomendación (además de leer Optimizing MySQL), es que trates de resolver primero los datos que debe devolver hasta lograr que la tabla devuelta sea lo más pequeña posible.
Si no puedes hacerlo, entonces crea consultas intermedias (tablas en memoria) con los resúmenes posibles de algunas partes, hasta encontrar una combinación eficiente, y recién entonces (y al final de ser posible) usa el GROUP BY.
Trata de no realizar consultas anidadas con varios GROUP BY. Es mejor obtener estos en tablas temporales.
Trata de hacer los JOIN solamente con campos clave y sobre todo si son numéricos.
Finalmente, pero no menos importante: No traigas todos los datos de las tablas, si necesitas solamente algunos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 29/01/2010, 02:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Optimizar Group By

¿Si lo haces con INNER JOIN, perdiendo, claro, en la muestra los que no tienen datos en la tabla2, ganas algo de tiempo, no?
Código SQL:
Ver original
  1. SELECT t1.ID, t1.DSC, IFNULL(t3.total,0) totalporID FROM tabla1 t1
  2. INNER JOIN (SELECT t2.tabla1_id ID, COUNT(*) total  FROM tabla2 t2 GROUP BY t2.tabla1.id)t3 ON t1.ID = t3.ID
  #6 (permalink)  
Antiguo 29/01/2010, 08:05
 
Fecha de Ingreso: mayo-2007
Mensajes: 27
Antigüedad: 17 años
Puntos: 0
Respuesta: Optimizar Group By

Gracias por las sugerencias, de todas formas sea con Group By o usando subselects, toma mucho tiempo. no me quedaría otra que indicar en la misma tabla 1 la cantidad de apariciones por lo que veo, aunque no es lo mas conveniente para el que actualiza la DB, pero al menos los usuarios tendran resultados mas rápidos en las búsquedas.
  #7 (permalink)  
Antiguo 31/01/2010, 08:48
Avatar de xbx
xbx
 
Fecha de Ingreso: mayo-2008
Ubicación: /home/xbx
Mensajes: 301
Antigüedad: 16 años
Puntos: 11
Respuesta: Optimizar Group By

Con la primer consulta que colocaste y teniendo solamente 50 mil registros, no deberías tener problemas de tiempo.

Seguramente no tienes los indices necesarios en tus tablas.

Saludos,

Etiquetas: group
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:21.