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

Ayuda para Optimizar consulta MySQL

Estas en el tema de Ayuda para Optimizar consulta MySQL en el foro de Mysql en Foros del Web. Hola amigos...Tengo la siguiente consulta: select internalID, ProdTitle from product where prodActive = 1 and internalID not in (select DISTINCT(ProdMainID) FROM product_categories_members) Esta consulta me ...
  #1 (permalink)  
Antiguo 19/04/2010, 16:23
Avatar de claus0618  
Fecha de Ingreso: noviembre-2008
Ubicación: USA
Mensajes: 21
Antigüedad: 16 años, 1 mes
Puntos: 0
Ayuda para Optimizar consulta MySQL

Hola amigos...Tengo la siguiente consulta:

select internalID, ProdTitle from product where
prodActive = 1 and
internalID not in (select DISTINCT(ProdMainID) FROM product_categories_members)

Esta consulta me permite obtener los productos que aun no tienen una categoria asignada. Sin embargo la tabla product tiene 2500 registros y la tabla product_categories_members tiene 8000. utilizando esta consulta me da como resultado 2500*8000 = 20'000.000 de registros totales a consultar. Es muy grande y por eso se cae el servidor.

¿Alguien podria ayudarme a mejorar esta consulta? he intentado con Joins y tampoco, el servidor termina por caerse. Les agradezco mucho.
  #2 (permalink)  
Antiguo 19/04/2010, 16:38
Avatar de 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
Puntos: 2658
Respuesta: Ayuda para Optimizar consulta MySQL

Probemos esto:
Código MySQL:
Ver original
  1.     internalID,
  2.     ProdTitle
  3.     product P LEFT JOIN product_categories_members PCM ON P.internalID = PCM.ProdMainID
  4.     PCM.ProdMainID IS NULL
  5.     AND P.prodActive = 1;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 19/04/2010, 16:51
Avatar de claus0618  
Fecha de Ingreso: noviembre-2008
Ubicación: USA
Mensajes: 21
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Ayuda para Optimizar consulta MySQL

Muchas gracias por tu aporte gnzsoloyo. Corri esta consulta localmente y se cae el apache. Y la corri online, me trajo resultados pero se demora casi 1 minuto en terminar solo de consultar. Es mucho tiempo aun, porque despues de esto debe armar un Excel con los resultados. ¿Alguna otra idea?

:)
  #4 (permalink)  
Antiguo 19/04/2010, 18:06
Avatar de 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
Puntos: 2658
Respuesta: Ayuda para Optimizar consulta MySQL

Otra posibilidad:
Código MySQL:
Ver original
  1.     P.internalID,
  2.     P.ProdTitle
  3.     (SELECT internalID, ProdTitleproduct FROM product WHERE prodActive = 1) P
  4.     LEFT JOIN
  5.     product_categories_members PCM ON P.internalID = PCM.ProdMainID
  6.     PCM.ProdMainID IS NULL;
Habría que probar también establecer un índice en la tabla `product_categories_members` sobre el campo ProdMainID, si es que no existe ya.
El tema pasa aquí por lograr definir un modo de alta selectividad en una de las dos tablas.
Si una tiene 25.000 y la otra 8.000l oque hay que lograr es reducir primero los registros devueltos por la primera, y luego los de la segunda.
El tema, en una página Web, es que la lentitud no está dada tanto por los registros, sino por la pasa de datos transportada, lo que significa que lo que se satura no es MySQL sino el TCP...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 20/04/2010, 10:56
Avatar de claus0618  
Fecha de Ingreso: noviembre-2008
Ubicación: USA
Mensajes: 21
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Ayuda para Optimizar consulta MySQL

Muchas gracias gnzsoloyo por tu nuevo aporte. Esta se demoro mas o menos lo mismo que las otras de 65 - 70 segundos en traer los resultados.

Tengo una nueva opcion.

Código MySQL:
Ver original
  1. select internalID, ProdTitle from product where
  2. prodActive = 1 and
  3.  not exists (select DISTINCT(ProdMainID) FROM product_categories_members where internalID = ProdMainID)

Esta consulta se demora 35 segundos en traer los datos. Aun sigue siendo mucho tiempo para un servidor web, pero por ahora es la mejor.

De nuevo muchas gracias.
  #6 (permalink)  
Antiguo 20/04/2010, 15:40
 
Fecha de Ingreso: abril-2010
Mensajes: 1
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda para Optimizar consulta MySQL

Claus permíteme algunos pequeños consejos, sería de gran ayuda que luego nos contaras como te ha ido.
-Primer consejo:En teoria mySql optimiza las subselects, es decir, si no cambia dicha sentencia utiliza los datos extraidos la primera vez. De esto podriamos deducir que la subselect de la primera opción que diste es "la más" correcta (sólo en teoria).
-Segundo consejo, para la tabla product crea un indice para InternalId(es posible que se cree implicitamente)
-Por último, si necesitas velocidad, utiliza el Engine=MYISAM y sacrifica las ventajas de INNODB O BDB, MYISAM es casi el triple de rápido

Un saludo, se agradeceria respuesta con los resultados

Etiquetas: consulta, joins, optimizar
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 20:25.