Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] cual de estas consultas es mas recomendable

Estas en el tema de cual de estas consultas es mas recomendable en el foro de Mysql en Foros del Web. Buenas, me gustaria conocer vuestra opinion ya que sois mas expertos que yo con el mysql, de estas 2 consultas cual me recomendariais. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 29/08/2013, 03:29
 
Fecha de Ingreso: febrero-2010
Mensajes: 157
Antigüedad: 14 años, 2 meses
Puntos: 5
cual de estas consultas es mas recomendable

Buenas, me gustaria conocer vuestra opinion ya que sois mas expertos que yo con el mysql, de estas 2 consultas cual me recomendariais.

Código MySQL:
Ver original
  1. select id from tb_pro where id not in(select id_pr from tb_im im where im.id_pr = tb_pro.id group by id_pr)


o
Código MySQL:
Ver original
  1. select id from tb_pro where id not in(select id_pr from tb_im im group by id_pr)


Gracias por sus aclaraciones

Última edición por gnzsoloyo; 29/08/2013 a las 04:14
  #2 (permalink)  
Antiguo 29/08/2013, 11:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: cual de estas consultas es mas recomendable

Hola yeyowave:

Cita:
me gustaria conocer vuestra opinion ya que sois mas expertos que yo con el mysql, de estas 2 consultas cual me recomendariais.
En realidad te recomendaría no utilizar ninguna de las dos .

En primer lugar, no nos dices qué es lo que quieres obtener con tus consultas, y de entrada, sin saber qué información tienes contenida en tus tablas resulta algo complicado saber cual de las dos es "mejor"...

Desde mi punto de vista lo que pretendes es encontrar todos los registros de tu tabla tb_pro que no existan en la tabla tb_im, ¿es correcto? ahora bien, si partimos de esta premisa trataré de hacer un análisis de tus consultas.

Por ejemplo, en la primer consulta vero que haces una especie de JOIN entre tus tablas tb_im y tb_pro... esto implica una comparación adicional. Esto limitaría por ejemplo el número de id's contra los que compararías... a qué me refiero con esto?, checa el siguiente ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. |    4 | cuatro      |
  9. |    5 | cinco       |
  10. +------+-------------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM tabla2;
  14. +------+-------------+
  15. | id   | descripcion |
  16. +------+-------------+
  17. |    1 | uno         |
  18. |    3 | tres        |
  19. |    5 | cinco       |
  20. |    6 | seis        |
  21. |    7 | siete       |
  22. +------+-------------+
  23. 5 rows in set (0.00 sec)

Con la primer consulta, comparas sólo contra los id's que existen en ambas tablas, (es decir, los registros 1, 3 y 5). Con la segunda consulta, comparas contra todos los id's de tu tabla2 (es decir los registros 1, 3, 5, 6 y 7). En este caso podrías pensar que la primer consulta es mejor ya que compara contra menos registros.

Sin embargo, si en tu tabla2 NO EXISTIERAN ID's QUE NO EXISTEN EN TU Tabla1, (es decir, los id=6 y 7 no existeran) entonces la comparación que haces en la primer consulta ES ABSOLUTAMENTE INÚTIL, y sólo consumiría tiempo al tener que hacer la comparación. Por lo tanto, la segunda consulta sería mejor.

Insisto, esto depende de cómo tengas tu información. A final de cuentas, ambas consultas regresan lo mismo:

Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM tabla1
  3.     -> WHERE id NOT IN( SELECT id
  4.     ->                  FROM tabla2
  5.     ->                  WHERE tabla1.id = tabla2.id
  6.     ->                  GROUP BY id);
  7. +------+-------------+
  8. | id   | descripcion |
  9. +------+-------------+
  10. |    2 | dos         |
  11. |    4 | cuatro      |
  12. +------+-------------+
  13. 2 rows in set (0.01 sec)
  14.  
  15. mysql> SELECT *
  16.     -> FROM tabla1
  17.     -> WHERE id NOT IN( SELECT id
  18.     ->                  FROM tabla2
  19.     ->                  GROUP BY id);
  20. +------+-------------+
  21. | id   | descripcion |
  22. +------+-------------+
  23. |    2 | dos         |
  24. |    4 | cuatro      |
  25. +------+-------------+
  26. 2 rows in set (0.00 sec)

Ahora bien, al inicio te decía que no recomendaba ninguna de las dos consultas... ¿por qué razón?, pues porque el operador IN es uno de los que peor rendimiento tienen, ya que realiza búsquedas exhaustivas... en lugar de eso podrías optar por el operador EXISTS, o mejor aun, hacerlo con un LEFT JOIN.

Código MySQL:
Ver original
  1. mysql> SELECT T1.*
  2.     -> FROm tabla1 T1
  3.     -> LEFT JOIN tabla2 T2 ON T1.id = T2.id
  4.     -> WHERE T2.id is null;
  5. +------+-------------+
  6. | id   | descripcion |
  7. +------+-------------+
  8. |    2 | dos         |
  9. |    4 | cuatro      |
  10. +------+-------------+
  11. 2 rows in set (0.00 sec)

Esta es a mi parecer, la mejor manera de hacer este tipo de comparaciones, ya que los JOIN's tienen mejor rendimiento que EXISTS e IN.

Finalmente algunas recomendaciones adicionales:

1. Revisa que tengas un buen diseño de índices... estos, más que las consultas, sí pueden afectar el rendimiento de una consulta.

2. Utiliza DISTINCT en lugar de GROUP BY.

3. Utiliza EXPLAIN para ver qué sugerencias te da el motor de BD para mejorar el desempeño de las consultas.

Saludos
Leo,
  #3 (permalink)  
Antiguo 12/09/2013, 06:02
 
Fecha de Ingreso: febrero-2010
Mensajes: 157
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: cual de estas consultas es mas recomendable

gacias leonardo_josue, me ayudaste mucho no cai en el null jejeje

Etiquetas: select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:53.