Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/10/2011, 08:47
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Consulta multitabla con doble clave foránea

hola latinpower:

La razón principal para el uso de JOIN's en lugar de WHERE son los tiempos de respuesta: aunque el resultado de las consultas es el mismo las rutinas implementadas en los JOIN'S están optimizadas, de tal suerte que en consultas con tablas muy grandes los tiempos de respuesta pueden ser bastante diferentes.

Por experiencia propia te comento que en el trabajo obtuvimos mejoras en tiempos de respuesta bastante considerables simplemente cambiando los joins. Es posible que si tus tablas no son muy grandes no veas cambios significativos en los tiempos, pero podrías hacer la prueba de cualquier manera.

Ademas en lo particular, pienso que las consultas quedan más legibles o "entendibles" utilizando JOINS ya que separas perfectamente los criterios que utilizas para unir las tablas y las condiciones normales. Te pongo dos ejemplos.

Código MySQL:
Ver original
  1. select T1.campo, T2.campo, T3.campo, T4.campo, Tabla5.Campo
  2. from tabla1 T1, Tabla2 T2, Tabla3 T3, Tabla4 T4, Tabla5 T5
  3. t1.campo = T2.campo and
  4. t1.campo2 = 1 and
  5. t1.campo = t3.campo and
  6. t2.campo2 = 'algo' and
  7. t1.campo = T4.campo and
  8. T3.campo3 > 10 and
  9. T4.campo4 not in (1,2,3) and
  10. T5.campo between 100 and 200
  11.  
  12. select T1.campo, T2.campo, T3.campo, T4.campo, Tabla5.Campo
  13. from tabla1 T1
  14. inner join Tabla2 T2 on t1.campo = T2.campo
  15. inner join Tabla3 T3 on t1.campo = t3.campo
  16. inner join Tabla4 T4 on t1.campo = T4.campo
  17. inner join Tabla5 T5 on T1.campo = T5.campo
  18. t1.campo2 = 1 and
  19. t2.campo2 = 'algo' and
  20. T3.campo3 > 10 and
  21. T4.campo4 not in (1, 2, 3)
  22. T5.campo between 100 and 200

en el primer caso, al mezclar tanto las condiciones de unión como las condiciones de filtrado en el WHERE puede resultar difícil ubicar una condición en específico, aunque bueno, esto último es bastante subjetivo. Finalmente, utilizando JOINS es poco probable que ocurran Productos cartecianos entres tus tablas, es decir que olvides colocar una condición de unión en el WHERE, ya que es fácil identificar sobre que JOIN no se ha definido la cláusula ON respectiva (Observaste que en la primer consulta la Tabla5 no se une con ninguna otra???).

Independientemente de si te inclinas por el WHERE o el JOIN, es importante que tengas una buena administración de indices en tus tablas y de ser posible siempre utilice EXPLAIN para tratar de optimizar tu consulta.

Saludos
Leo.