Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/11/2014, 08:57
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Optimar consulta SELECT

Hola de nuevo David_Carrera_G:

Cita:
me asalta una duda luego del LEFT JOIN indicaste una clausula [AND T.ibs IS NULL] esta se te colo o lo agregaste como condición al LEFT JOIN???.
La condición va en el WHERE... como te comenté en el post pasado, una alternativa para mejorar las condiciones IN, es utilizar un LEFT JOIN... checa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+----------------+
  3. | ID   | Nombre_Usuario |
  4. +------+----------------+
  5. |    1 | Ramon          |
  6. |    2 | Juan           |
  7. |    3 | Hugo           |
  8. |    4 | Paco           |
  9. |    5 | Luis           |
  10. +------+----------------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM tabla2;
  14. +------+-------------+
  15. | id   | descripcion |
  16. +------+-------------+
  17. |    1 | Ramon       |
  18. |    3 | Hugo        |
  19. |    5 | Luis        |
  20. +------+-------------+
  21. 3 rows in set (0.00 sec)

Supongamos que queremos obtener los registros de la tabla1 que no existen en la tabla2... de la manera en que tú lo haces sería asi:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM Tabla1 WHERE id NOT IN (SELECT id FROM tabla2);
  2. +------+----------------+
  3. | ID   | Nombre_Usuario |
  4. +------+----------------+
  5. |    2 | Juan           |
  6. |    4 | Paco           |
  7. +------+----------------+
  8. 2 rows in set (0.00 sec)

El problema con este tipo de consultas, es que la subconsulta del IN se ejecuta una vez por cada registro que exista en la tabla2... es por eso que tiene tan bajo rendimiento. Al utilizar un LEFT JOIN, puedes obtener el mismo resultado:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla1 T1
  2.     -> LEFT JOIN tabla2 T2 ON T1.id = T2.id
  3.     -> WHERE T2.id IS NULL;
  4. +------+----------------+
  5. | ID   | Nombre_Usuario |
  6. +------+----------------+
  7. |    2 | Juan           |
  8. |    4 | Paco           |
  9. +------+----------------+
  10. 2 rows in set (0.00 sec)

Observa que la condición IS NULL se debe colocar el la sección WHERE, la explicación visual se da si hacemos un SELECT * de ambas tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1 T1
  2.     -> LEFT JOIN tabla2 T2 ON T1.id = T2.id
  3.     -> ORDER BY T1.id;
  4. +------+----------------+------+-------------+
  5. | ID   | Nombre_Usuario | id   | descripcion |
  6. +------+----------------+------+-------------+
  7. |    1 | Ramon          |    1 | Ramon       |
  8. |    2 | Juan           | NULL | NULL        |
  9. |    3 | Hugo           |    3 | Hugo        |
  10. |    4 | Paco           | NULL | NULL        |
  11. |    5 | Luis           |    5 | Luis        |
  12. +------+----------------+------+-------------+
  13. 5 rows in set (0.00 sec)

Observa que los campos que no tienen una correspondencia el la tabla2 se ponen en NULL, por lo tantos son sólo estos los que te interesa recuperar.

finalmente mencionas esto:

Cita:
estas bases son transaccionales, por lo cual no poseen indices en sus tablas.
No entiendo qué tiene que ver una cosa con la otra... ¿a qué te refieres con que son bases transaccionales y por qué razón no poseen índices?

Saludos
Leo.