Ver Mensaje Individual
  #6 (permalink)  
Antiguo 15/03/2011, 11:35
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: 16 años, 5 meses
Puntos: 2658
Respuesta: Producto cartesiano y JOIN

Básicamente, si, pero por definición un producto cartesiano es un producto de conjuntos (A * B). En bases de datos se considera la peor forma de consulta, porque lo que se hace es combinar cada registro de la tabla A con cada uno de los registros de la tabla B, más allá del filtro aplicado en las condiciones del WHERE.
Esta situación da lugar a tablas virtuales (o derivadas) inmensas inútilmente cargadas, que no pueden optimizarse porque las condiciones de optimización no están en la definición de esa junta, sino en el WHERE.
En el caso de MySQL, éste realiza la combinación emparejando campos que tengan el mismo nombre, eventualmente el mismo tipo, pero esto hace que puedan emparejarse campos cuyos dominios sean completamente incompatibles, lo que puede dar lugar a resultados erróneos. Esta situación se suele producir cuando en dos tablas hay campos del mismo nombre, dedicados a datos completamente diferentes (la ociosidad de los programadores tiene a generar estas cosas).
En lugar de eso, el INNER/LEFT/RIGHT JOIN realiza un matching (coincidencia) entre las tablas en el momento de la lectura, haciendo la comparación sólo con los campos indicados en el ON, lo que redunda en lecturas mucho más reducidas y rápidas, que pueden optimizarse recurriendo a índices. En ese sentido (Heimish2000 ya te lo menciona), el INNER JOIN es inmensamente más eficiente.

El uso de las FK no es obligatorio para usar JOIN, o la coma (sintacticamente equivalente según el manual), o bien el INNER JOIN, de hecho se puede hacer de cualquier forma. El sentido de una FK es en realidad la de mantener la consistencia e integridad, no las consultas en sí.

Resumiendo: Un producto cartesiano es algo que se debe evitar, siempre, ya que resulta completamente ineficiente. Usa INNER JOIN.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)