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

consultas similares

Estas en el tema de consultas similares en el foro de Mysql en Foros del Web. Buenas a todos, estaba haciendo una consulta mysql pero utilizando el explain, me di cuenta de que tenía que optimizar una consulta, esta en cuestión ...
  #1 (permalink)  
Antiguo 20/01/2014, 13:25
 
Fecha de Ingreso: marzo-2013
Mensajes: 83
Antigüedad: 11 años, 1 mes
Puntos: 0
consultas similares

Buenas a todos, estaba haciendo una consulta mysql pero utilizando el explain, me di cuenta de que tenía que optimizar una consulta, esta en cuestión

Código MySQL:
Ver original
  1.     CONCAT(U.Nombre,' ',U.PrimerApellido) Personas,
  2.     SUM(Puestas) Puestas,
  3.     SUM(Retiradas) Retiradas,
  4.     SUM(Total) Total
  5.     (SELECT
  6.         E.id_Usuario_coloca Persona,
  7.         SUM(IF(E.Fecha_registro IS NOT NULL, 1, 0)) Puestas,
  8.         0 Retiradas,
  9.         SUM(1) Total
  10.     FROM etiquetas E
  11.     LEFT JOIN Usuarios U ON U.id_Usuario=E.id_Usuario_coloca
  12.     WHERE E.Fecha_registro IS NOT NULL
  13.     GROUP BY Persona)
  14.    
  15.     UNION ALL
  16.    
  17.     (SELECT
  18.         E.id_Usuario_retira Persona,
  19.         0 Puestas,
  20.         SUM(IF(E.Fecha_ejecucion IS NOT NULL, 1, 0)) Retiradas,
  21.         SUM(1) Total
  22.     FROM etiquetas E
  23.     LEFT JOIN Usuarios U ON U.id_Usuario=E.id_Usuario_retira
  24.     WHERE E.Fecha_ejecucion IS NOT NULL
  25.     GROUP BY Persona)
  26. )Etiquetas
  27. LEFT JOIN Usuarios U ON U.id_Usuario=Persona
  28. GROUP BY Personas

Ya que obtenía como resultado en la primera linea del explain:

table derived, type ALL possible_Keys NULL, ref NULL rows: 502777044 extra usin temporaty; Using filesort

Vamos una barbaridad de filas exploradas,

Así hice esta otra consulta (Obteniendo el mismo resultado) a priori mucho mas sencilla y fácil ya que en el explain veo que se consultan pocas filas:

Código MySQL:
Ver original
  1.     CONCAT(U.Nombre,' ',U.PrimerApellido) Persona,
  2.     SUM(IF(E.id_Usuario_coloca=U.id_Usuario, 1, 0)) Puestas,
  3.     SUM(IF(E.id_Usuario_retira=U.id_Usuario, 1, 0)) Retiradas,
  4.     SUM(IF(U.id_Usuario = E.id_Usuario_coloca AND U.id_Usuario = E.id_Usuario_retira, 2, 1)) Total
  5. FROM etiquetas E
  6. LEFT JOIN Usuarios U ON U.id_Usuario=E.id_Usuario_coloca or U.id_Usuario=E.id_Usuario_retira
  7. WHERE E.Fecha_registro IS NOT NULL
  8. GROUP BY Persona


Pues bien, en la primera consulta me tardó 1.1 segundo y en la segunda 2.1 segundo, como puede ser eso si no tiene ni UNION ALL, menos GROUP BY y ORDER BY????

Me da que puede ser por el OR del LEFT JOIN de la tabla usuarios, ¿Qué opináis?
  #2 (permalink)  
Antiguo 21/01/2014, 09:18
 
Fecha de Ingreso: marzo-2013
Mensajes: 83
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: consultas similares

up Siguo con la duda...
  #3 (permalink)  
Antiguo 22/01/2014, 01:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: consultas similares

soy de tu misma opinión y, aunque no puedo darte la respuesta fundada en argumentos demasiado técnicos, pues no sé el orden en que el parser hace le trabajo, te diré que deberías hacer la prueba para comprobar que ese or es la causa. Quita desde or U.id_Usuario=E.id_Usuario_retira a ver qué sucede con el tiempo de respuesta.
Por lo demás, no es lo mismo hacer un cruce entre todos los datos de las tablas con todos (que obliga, si no se pueden utilizar los índices, a hacer un scan completo cada vez que realiza una operación) que filtrar en dos consultas algunos datos (no todos), unirlas con UNION y mediante subconsulta relacionarla con la tabla de referencia (que es lo que haces al en la primera consulta). Y luego está el problema del ORDER BY que sospecho que duplica su tiempo de ejecución en la segunda consulta. Pero esto son probablemente sospechas poco fundadas más que argumentos convincentes.
  #4 (permalink)  
Antiguo 22/01/2014, 10:18
 
Fecha de Ingreso: marzo-2013
Mensajes: 83
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: consultas similares

Si quito or U.id_Usuario=E.id_Usuario_retira en la segunda consulta...

El tiempo de ejecucion pasa a ser de tan solo 0.6 segundos!!!

Aunque claro, no obtengo el resultado que necesito

Me voy a quedar evidentemente con la primera de las consultas, aunque iré viendo si puedo ir refinandola,

Muchas gracias por el tiempo dedicado jurena

Etiquetas: sql
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 14:42.