Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/01/2014, 13:25
joselegolas
 
Fecha de Ingreso: marzo-2013
Mensajes: 83
Antigüedad: 12 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?