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

Optimizar consulta - LEFT JOIN'S

Estas en el tema de Optimizar consulta - LEFT JOIN'S en el foro de Mysql en Foros del Web. Buenas , tengo un incoveniente, resulta que tengo una consulta que demora 20 segundos (contra una tabla t1 de 1500 registros y otra t2 de ...
  #1 (permalink)  
Antiguo 17/08/2011, 11:44
 
Fecha de Ingreso: diciembre-2008
Mensajes: 190
Antigüedad: 15 años, 4 meses
Puntos: 6
Optimizar consulta - LEFT JOIN'S

Buenas , tengo un incoveniente, resulta que tengo una consulta que demora 20 segundos (contra una tabla t1 de 1500 registros y otra t2 de 12000) .
No puedo encontrarle la vuelta, muestro la consulta y lo que probe
Inicialmente:
Código MySQL:
Ver original
  1. SELECT t1.campos,t4.campo FROM
  2. tabla1 t1
  3. LEFT JOIN t2 ON (t2.camposinindice = t1.id and t2.otrocampo=1 )
  4. LEFT JOIN t3 ON (t3.id  = t2.campo3 )
  5. LEFT JOIN t4 ON (t4.id = t3.campodet3)
  6. WHERE 1=1
  7. GROUP by t1.id

Como veran necesitaba un campo de t4 a partir de t1 (ya que es una consulta a esa tabla, en este caso a todos los registros)

El tema es que t2 al cruzarse con t1 puede devolver mas de un registro, y al querer cruzar t3 con t2 se genera un conflicto (creo q esta ahi el meollo) ya que trae mas de un registro.

Ahora quise solucionarlo devolviendo un solo resultado en ese LEFT JOIN pero solo consegui reducir 5 segundos. (con la siguiente sentencia, saque t2):

Código MySQL:
Ver original
  1. SELECT t1.campos,t4.campo FROM
  2. tabla1 t1
  3. LEFT JOIN tabla3 t3 ON
  4.                         (t3.id =
  5.                                 (   SELECT t2b.campo3
  6.                                     FROM tabla2 t2b
  7.                                     WHERE t2b.otrocampo=1
  8.                                     AND t2b.camposinindice = t1.id
  9.                                    
  10.                                     LIMIT 1
  11.                                 )
  12.                         )
  13. LEFT JOIN t4 ON (t4.id = t3.campodet3)
  14. WHERE 1=1
  15. GROUP by t1.id

Agradezco mucho su tiempo y ayuda ya que estoy perdido.
Saludos
  #2 (permalink)  
Antiguo 17/08/2011, 12:03
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 consulta - LEFT JOIN'S

El primer problema que puedes tener es que LEFT JOIN devuelve todo lo que está en la t1, tenga o no coincidencias con t2. A su vez lo que sea no nulo en t2 será devuelto completo, tenga o no coincidencias en t3 y lo mismo sucederá con t4.
En definitiva, puede que estés recuperando demasiados registros o incluso que estés recuperando registros inútiles, sea porque no cumplen con el segundo LEFT JOIN o el tercero.
¿Has pensado en usar INNER JOIN en lugar de LEFT JOIN, y definir un índice sobre t2.otrocampo
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 17/08/2011, 12:17
 
Fecha de Ingreso: diciembre-2008
Mensajes: 190
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Optimizar consulta - LEFT JOIN'S

Buenas, INNER JOIN no me sirve porq puedo haber registros de t1 que debe traer sin tener que cruzarse con t2.
Por otro lado te cuento que defini como dijiste como indice a t2b.camposinindice y ahora no me demora ni un segundo, con lo cual te agradezco muchisimo.
Todo lo que me planteaste pasa seguro, por eso como ultima duda es saber si esta consulta esta mal diseñada, si por ejemplo ese dato deberia traerse en una subconsulta en el select sin left joins o esto es algo habitual.
Nuevamente muchas gracias gnzsoloyo.
  #4 (permalink)  
Antiguo 17/08/2011, 12:24
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 consulta - LEFT JOIN'S

Por lo que parece el problema estaba en la segunda tabla. Como hay nulos, la incidencia de los mismos cuando es alta hace que se barra la tabla entera, y en este caso era demasiado.
Lo que debes ver es si ciertas relaciones entre tablas pueden ser agrupadas dentro de un INNER JOIN, que es mucho más eficiente que el LEFT JOIN.
El cualquier caso, sin datos reales es difícil saber hacia donde ir.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campos, join, left, registros, select, tabla
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 01:20.