Tema: Inner join
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 16/11/2008, 08:33
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: Inner join

Cuando usas un esquema del tipo:
Código sql:
Ver original
  1. SELECT tabla1.nombre, tabla2.ciudad, tabla3.codigo
  2. FROM tabla1, tabla2, tabla3
  3. WHERE
  4. link.nombre = tabla1.id
  5. AND
  6. link.ciudad = tabla2.id
  7. AND
  8. link.codigo = tabla3.id"

MySQL no puede optimizarlo de ninguna forma porque no sabe inicialmente cuátos registros devolverá cada condición del WHERE. Por eso es preferible usar al WHERE como selector final de algo que ya se haya depurado suficientemente. Allí es donde entra el JOIN y en el caso el INNER JOIN.
Piensalo de esta forma: Si lee en forma secuencial, y no existe ningún índice definido con los tres campos como clave, entonces recuperará todos los registros de la primera condición, luego eliminará de ese conjunto los de la segunda condición y finalmente los de la tercera. Cada comparación es secuencial, con lo que la consulta resulta muy ineficiente.
El INNER JOIN lee por coincidencia de los tres campos al mismo tiempo, en tanto los hagas encadenando el JOIN de forma correcta:

Código sql:
Ver original
  1. SELECT T1.nombre, T2.ciudad, T3.codigo
  2. FROM link L INNER JOIN tabla1 T1 ON L.nombre = T1.id
  3.    INNER JOIN tabla2 T2 ON L.ciudad = T2.id
  4.    INNER JOIN tabla3 T3 ON L.codigo  = T3.id

Dos detalles:
1. SI la tabla link usa los las tres PK para crear el registro como FK y cada registros es único, el campo ID de esa tabla es innecesario, ya que la unicidad esta dada por las tres (relación 1 a N). En todo caso tomas los tres campos y los defines como PK y listo.
2. No es buena costumbre poner los ID numéricos que sean claves con el mismo nombre en diferentes tablas. Termina siendo difícil distinguir a cuál te refieres al codificar. Si te equivocas de tabla dependiente no lo sabrás hasta que los resultados no sean los esperados. Lo que suele hacerse es darle en sufijo "ID" al nombre del campo, pero el prefijo haciendo referencia a la tabla; de esta forma quedaría: LINK_ID, CIUDAD_ID, CODIGO_ID, NOMBRE_ID. Es la forma más mnemotécnica de escribir los nombres. Lo verás si analizas modelos de bases de datos estandarizadas (es un habito de la programación, como poner o, v, o t delante de las variables en POO).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)