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

Consulta muy larga

Estas en el tema de Consulta muy larga en el foro de Mysql en Foros del Web. Buenas gente, tengo unas tablas con unos cuantos registros (foto e imatges tienen aproximadamente 100k registros cada una mientras que familia y autor no llegan ...
  #1 (permalink)  
Antiguo 10/07/2014, 01:42
Avatar de Heent  
Fecha de Ingreso: diciembre-2008
Mensajes: 140
Antigüedad: 15 años, 11 meses
Puntos: 6
Pregunta Consulta muy larga

Buenas gente, tengo unas tablas con unos cuantos registros (foto e imatges tienen aproximadamente 100k registros cada una mientras que familia y autor no llegan a los 3k). La cosa es que hay información interrelacionada entre las distintas tablas que es:

Cada foto tiene una familia, un autor y una imagen. Están relacionados con un id, es decir cada autor y familia tienen un identificador que es el que está guardado a la tabla de foto.

Entonces me gustaría recuperar todas las fotos de un pueblo determinado (cada foto procede de un pueblo) con la información completa de cada autor y familia también. Por lo que estoy viendo en el servidor mi consulta es muy poco optima porqué satura toda mi CPU y tarda un montón.

Código MySQL:
Ver original
  1. SELECT f.des, f.referencia, f.familia AS num, f.fons,
  2.                a.nombre AS autor, fa.nombreMostrar AS familia, img.url
  3.  
  4.         FROM foto f
  5.  
  6.         LEFT JOIN ( SELECT a.nombre, a.id
  7.                     FROM autor a
  8.                     GROUP BY a.id ) a ON f.autor=a.id
  9.  
  10.         LEFT JOIN ( SELECT fa.nombreMostrar, fa.numero, fa.id
  11.                     FROM familia fa
  12.                     WHERE fa.pueblo='$pueblo'
  13.                     GROUP BY fa.id ) fa ON f.familia=fa.numero
  14.  
  15.         LEFT JOIN ( SELECT img.url, img.referencia
  16.                     FROM imatges img
  17.                     GROUP BY img.referencia ) img ON f.referencia=img.referencia
  18.  
  19.         WHERE pueblo='$pueblo' ORDER BY f.referencia;

¿Como podría optimizar la consulta?


Un slaudo y muchas gracias!
  #2 (permalink)  
Antiguo 10/07/2014, 06:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Consulta muy larga

Código MySQL:
Ver original
  1. SELECT f.des, f.referencia, f.familia AS num, f.fons,
  2.        a.nombre AS autor, fa.nombreMostrar AS familia, img.url
  3. FROM foto f
  4.         LEFT JOIN autor a ON f.autor=a.id
  5.         LEFT JOIN familia fa ON f.familia=fa.numero
  6.         LEFT JOIN imatges img ON f.referencia=img.referencia
  7. WHERE fa.pueblo='$pueblo'
  8. ORDER BY f.referencia;

No acabas de dar la información necesaria para entender porque hacias esos GROUP BY pero si los datos estan bien no serian necesarios.

Tambien se podría simplificar quitando los LEFT JOIN y subtituyendolos por INNER JOIN pero para ello debería saber si hay o no fotos sin autor, familia, o imatges, este último casi que no tendría sentido una foto sense imatge, no?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 11/07/2014, 01:02
Avatar de Heent  
Fecha de Ingreso: diciembre-2008
Mensajes: 140
Antigüedad: 15 años, 11 meses
Puntos: 6
Pregunta Respuesta: Consulta muy larga

Buenas, muchas gracias. En principio puede darse el caso de una foto sin familia pero muy raramente.

Entonces es más eficiente un INNER JOIN que un LEFT JOIN y un LEFT JOIN es mejor que un LEFT JOIN con SELECT, no?


Un saludo y muchas gracias!
  #4 (permalink)  
Antiguo 11/07/2014, 03: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: 17 años
Puntos: 2658
Respuesta: Consulta muy larga

No exactamente.
Un INNER JOIN no se usa en los mismos casos que los LEFT y RIGHT. Depende de lo que se desea obtener.
El INNER JOIN requiere que haya relación ion entre ambas tablas, y devolverá sólo los registros coincidentes.
El LEFT JOIN devolverá todo lo de la primera tabla, incluso si no hay coincidencia con la segunda, poniendo nulo en los campos devueltos de la segunda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 11/07/2014 a las 03:08

Etiquetas: join, larga, registro, 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 12:52.