Ver Mensaje Individual
  #2 (permalink)  
Antiguo 30/01/2013, 11:04
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Depurar consulta time out - Error loading module MySQL server...

Por empezar, ordenemos esa consulta como para que sea entendible:
Código MySQL:
Ver original
  1.     m.id,
  2.     m.title,
  3.     m.module,
  4.     m.position,
  5.     m.content,
  6.     m.showtitle,
  7.     m.params,
  8.     mm.menuid
  9.     qq3v9_modules AS m
  10.     LEFT JOIN qq3v9_modules_menu AS mm ON mm.moduleid = m.id
  11.     LEFT JOIN qq3v9_extensions AS e ON e.element = m.module AND e.client_id = m.client_id
  12.     m.published = 1
  13.     AND e.enabled = 1
  14.     AND (m.publish_up = '0000-00-00 00:00:00' OR m.publish_up <= '2013-01-30 16:30:16')
  15.     AND (m.publish_down = '0000-00-00 00:00:00' OR m.publish_down >= '2013-01-30 16:30:16')
  16.     AND m.access IN (1,1)
  17.     AND m.client_id = 0
  18.     AND (mm.menuid = 0 OR mm.menuid <= 0)
  19.     AND m.language IN ('en-GB','*')
  20. ORDER BY m.position, m.ordering
Ahora podemos ver que es una consulta que tiene el potencial de generar un producto cartesiano, ya que hace un fullscan por cada tabla para poder realizar esas comparaciones, y si las mismas son demasiado grandes el resultado es.. calamitoso.
Es uno de los problemas de el LEFT JOIN, pero también de operaciones de tipo "<=". Cualquier condición con operadores que impliquen inecuaciones genera un fullscan.
A esto hay que sumarle, por lo menos, que ORDER BY es una de las cláusulas que más asesina la performance, en especial cuando la respuesta de la consulta ya es un producto cartesiano.

Creo que deberás optimizar eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)