Ver Mensaje Individual
  #4 (permalink)  
Antiguo 19/11/2010, 19:38
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, 3 meses
Puntos: 2658
Respuesta: es lo mismo aplicar una condicion en where que en el join?

Brevemente:
Los DBMS en general tienen algoritmos internos que determinan el "camino" que usarán para obtener los resultados. Esos "caminos" no siempre son los mismos, incluso para consultas que involucren las mismas tablas porque además de utilizar la forma de escritura de la consulta, utilizan cierta inteligencia obtenida estadísticamente de los métodos utilizados que dieron mejor resultado previamente.
Ello se puede apreciar en algunos DBMS como SQL Server, que tiene una herramienta que permite visualizar el plan de ejecución de la consulta.
En el caso de MySQL pasa lo mismo, aunque sin la herramienta visual. De todos modos se cuenta con una sentencia denominada EXPLAIN la cual permite ver un análisis de lo que MySQL hace para obtener el resultado, y eventualemente las sugerencias para optimizar la misma.

Pero aún así, hay ciertas cosas que si podemos decir a priori:

1) Siempre es más eficiente usar JOIN (y especialmente INNER/LEFT/RIGHT) porque una gran parte del filtrado se produce mientras las tablas están siendo leídas, y también porque el FROM es optimizable por el parser, que resuelve diferentes modos de obtener el resultado.

2) Poner las condiciones en el WHERE es ineficiente, porque el parser no puede optimizarlo. Únicamente puede la performance ser afectada por la existencia de índices que trabajen sobre las condiciones puestas en él. Pero nada más. Pero un indice también puede provocar una baja performance, porque se trata de una estructura que hay que mantener... y todo objeto a mantener equivale a procesos corriendo en background...
Las condiciones del WHERE se aplican después de leer las tablas, por lo que es muy propenso a la creación de productos cartesianos, que es una de las peores condiciones de una consulta.

Finalmente: A niveles de pequeñas tablas (decenas de miles de registros), la performance de ambas cosas es similar. No pareciera haber demasiada diferencia, pero existe. Para ello es mejor utilizar el EXPLAIN.
Cuando la cantidad de registros llega a centenares de miles o millones, el efecto en la performance del JOIN se hace más evidente.
Piensa que por algo fue creado y por alguna razón es la forma más usada apra las consultas... y eso no es porque sea menos eficiente.

¿No te parece?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)