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

Ayuda a mejorar consulta

Estas en el tema de Ayuda a mejorar consulta en el foro de Mysql en Foros del Web. Buenas a todo el mundo, tengo una consulta que me está matando el servidor, me tarda 11 segundos en escupir resultados y me gustaría ver ...
  #1 (permalink)  
Antiguo 04/11/2010, 17:02
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Ayuda a mejorar consulta

Buenas a todo el mundo, tengo una consulta que me está matando el servidor, me tarda 11 segundos en escupir resultados y me gustaría ver si alguien puede mejorarla:

Cita:
Select a.idarticulo,p.idpedido,d.titulo, d.adicional, d.url, a.precioa, a.preciob, a.precioc ,a.idstock,a.imagen1, a.url As ul, f.url_l, Count(p.idarticulo) As ContArt, a.idstock, a.comprable, a.idarticulo, a.precioanterior From (((art a Inner Join art_desc d ON a.idarticulo=d.idarticulo And d.ididioma=0) Inner Join fam_desc f ON a.idfamilia=f.idfamilia And f.ididioma=0) Inner Join ped_det p ON a.idarticulo=p.idarticulo And p.idpedido IN (Select idpedido From ped_det where idarticulo=1860) And a.idarticulo<>1860)) Where a.publicar='True' And a.idstock<>3 And a.comprable='True' Group By a.idarticulo Order By ContArt DESC Limit 6;
La parte que más consume (el 80%) es de lo que está en negrita, ¿alguien me puede echar una mano?

Tengo índices en los campos a.idarticulo, d.idarticulo, d.idioma, f.ididioma, p.idarticulo, a.publicar, a.idstock, a.comprable
Vamos, en todos los campos que están incluidos en la consulta, he probado a hacer indices combinados pero tampoco mejora.

La instrucción "explain" de mysql me da como resultado lo que adjunto en la imagen.



Muchas gracias.
  #2 (permalink)  
Antiguo 04/11/2010, 21:25
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Ayuda a mejorar consulta

Saludos

Pero no veo concordancia con esta parte de la sentencia

Cita:

(Select idpedido From ped_det where idarticulo=1860) And a.idarticulo<>1860)
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #3 (permalink)  
Antiguo 05/11/2010, 10:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ayuda a mejorar consulta

Buenos días Pempas... al igual que a nano no le encuentro lógica al justamente a lo que tienes en negritas,

Código MySQL:
Ver original
  1. Inner Join ped_det p ON a.idarticulo=p.idarticulo And p.idpedido IN (Select idpedido From ped_det where idarticulo=1860) And a.idarticulo<>1860)

Sobre todo por el hecho de que estás haciendo un inner join sobre ped_det y en la sección IN consultas nuevamente sobre esta misma tabla... intenta con esto, a reserva de tener algunos datos de prueba creo que debería regresar los mismos registros...

Código MySQL:
Ver original
  1. Select a.idarticulo,p.idpedido,d.titulo, d.adicional, d.url, a.precioa, a.preciob, a.precioc ,a.idstock,a.imagen1, a.url As ul, f.url_l, Count(p.idarticulo) As ContArt, a.idstock, a.comprable, a.idarticulo, a.precioanterior
  2. art a
  3. Inner Join art_desc d ON a.idarticulo=d.idarticulo
  4. Inner Join fam_desc f ON a.idfamilia=f.idfamilia
  5. Inner Join ped_det p ON a.idarticulo=p.idarticulo
  6. )
  7. d.ididioma=0 and
  8. f.ididioma=0 and
  9. a.publicar='True' and
  10. a.idstock <> 3 and
  11. a.comprable='True' and
  12. a.idarticulo<>1860
  13. Group By a.idarticulo
  14. Order By ContArt DESC Limit 6;

Si no obtienes el mismo resultado en la medida de lo posible pon algunos datos de ejemplo, para tratar de replicar el escenario en un BD de pruebas.

Saludos
Leo.
  #4 (permalink)  
Antiguo 06/11/2010, 02:54
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Respuesta: Ayuda a mejorar consulta

Buenas y gracias a lo dos,
leonardo, la consulta que me sugieres ya la probé, pero no me funciona igual, no me da el mismo resultado.
La consulta en definitiva tiene que sacar la típica lista de "clientes que compraron este producto también compraron", si pongo tu consulta, efectivamente me saca productos comprados, pero siempre el top.
El tema de poner el IN en pedidos es precisamente para que me extraiga productos que estén en pedidos donde el idarticulo consultado (el que se está viendo en la web actualmente) también esté.

Espero que me hayáis entendido la duda.

En definitiva dice:

1. sacame ciertos datos (título, precio, etc)
2. vinculando con la tabla de descripciones (art_desc)
3. vinculando con la tabla de familias (art_fam)
4. vinculando con la tabla de detalles de pedido (la que tiene las líneas de las que se compone el pedido)
5. cuyo idarticulo actual, contenga más idarticulos que sean diferentes al conultado pero que se encuentren en el mismo pedido.
6. ordenalos por mayor a menor resultado.

En teoría es una consulta sencilla, pero tarda demasiado...

gracias!
  #5 (permalink)  
Antiguo 08/11/2010, 09:29
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ayuda a mejorar consulta

Hola pempas, agregué una condición más a la consulta, para hacer la función del IN... pruedes probarla para ver si te funciona, si sigue el error tal como te comenté en el post pasado pon algunos datos de ejemplo para ver en qué está fallando la consulta.

Código MySQL:
Ver original
  1. SELECT a.idarticulo,p.idpedido,d.titulo, d.adicional, d.url, a.precioa, a.preciob, a.precioc ,a.idstock,a.imagen1, a.url As ul, f.url_l, Count(p.idarticulo) As ContArt, a.idstock, a.comprable, a.idarticulo, a.precioanterior
  2. ped_det p
  3. INNER JOIN art a ON a.idarticulo=p.idarticulo
  4. INNER JOIN (SELECT idpedido FROM ped_det WHERE idarticulo=1860) T1
  5. ON T1.idPedido = p.idPedido
  6. INNER JOIN art_desc d ON a.idarticulo=d.idarticulo
  7. INNER JOIN fam_desc f ON a.idfamilia=f.idfamilia
  8. d.ididioma=0 AND
  9. f.ididioma=0 AND
  10. a.publicar='True' AND
  11. a.idstock <> 3 AND
  12. a.comprable='True' AND
  13. a.idarticulo<>1860
  14. GROUP BY a.idarticulo
  15. ORDER BY ContArt DESC LIMIT 6;

Saludos
Leo.
  #6 (permalink)  
Antiguo 08/11/2010, 12:58
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Respuesta: Ayuda a mejorar consulta

La leche!!
como cambió la consulta con esta instrucción, la verdad es que ha mejorado muchísimo, ha pasado de 10 segundos a apenas 1... ¿cómo puede ser?

Mil gracias!!!

Etiquetas: mejoras
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 00:54.