Cuando usas un esquema del tipo:
Código sql:
Ver originalSELECT tabla1.nombre, tabla2.ciudad, tabla3.codigo
FROM tabla1, tabla2, tabla3
WHERE
link.nombre = tabla1.id
AND
link.ciudad = tabla2.id
AND
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 originalSELECT T1.nombre, T2.ciudad, T3.codigo
FROM link L INNER JOIN tabla1 T1 ON L.nombre = T1.id
INNER JOIN tabla2 T2 ON L.ciudad = T2.id
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).