MySQL - Optimizar consulta MySQL: Join?

 
Vista:

Optimizar consulta MySQL: Join?

Publicado por Kibura (2 intervenciones) el 05/01/2015 13:28:59
Hola!

Tengo una consulta MySQL que me resulta bastante compleja. Llevo días tratando de optimizarla lo máximo posible, pero lo cierto es que se solicitan muchos campos y se relacionan varias tablas, por lo que he llegado a un punto muerto en el que no sé cómo optimizarla aún más, a pesar de que el tiempo de respuesta sigue siendo bastante alto.

La consulta, para seleccionar todos los datos de ciertos productos de una tabla "producto", es la siguiente:

SELECT SQL_CALC_FOUND_ROWS DISTINCT P.codigo AS codigo, P.precio AS precio, P.iva AS iva, P.nombre AS nombre, P.descripcionCorta AS descripcionCorta,
(SELECT imagen FROM fotograf WHERE codProducto=P.codigo) AS imagen,
(SELECT descripcion FROM fotograf WHERE codProducto=P.codigo) AS altImagen,
(SELECT SUM(puntuacion) FROM puntuacionProducto WHERE codigo=P.codigo) AS puntuacion,
(SELECT valor FROM condiciocliprod WHERE codProducto=P.codigo AND (orden=0 OR orden=1) LIMIT 0, 1) AS descuento
FROM (producto AS P, categoria AS C, categoriasproductos AS CP, categoria AS C2)
INNER JOIN carvalor AS CV ON CV.codObjeto = P.codigo AND (CV.valor = 'ARMANI COLLEZIONI')
WHERE P.codigo=CP.codProducto
AND (CP.codCategoria=2 OR (CP.codCategoria=C.codigo AND C.codPadre=2)
OR (CP.codCategoria=C.codigo AND C.codPadre=C2.codigo AND C2.codPadre=2))
AND P.activo=1
ORDER BY P.codigo DESC
LIMIT 0,12;

Ya he anidado las subconsultas que devuelven "imagen", "altImagen", "puntuacion" y "descuento" para realizar una única conexión a la base de datos.
También he modificado "WHERE" por "INNER JOIN" en los casos en que he podido excepto en uno:

WHERE P.codigo=CP.codProducto
AND (CP.codCategoria=2 OR (CP.codCategoria=C.codigo AND C.codPadre=2)
OR (CP.codCategoria=C.codigo AND C.codPadre=C2.codigo AND C2.codPadre=2))

Aquí se buscan los productos que se encuentran en esa categoría dada (en este caso 2), en una de las subcategorías de la categoría dada o en una de las subcategorías de cualquier subcategoría de la categoría dada... un lío vamos. La cuestión es que al tener 2 referencias distintas (C y C2) de una misma tabla ("categoría"), no sé cómo expresar esto en un "JOIN".

¿Alguien sabe cómo puedo optimizar mejor esta consulta?
Gracias de antemano!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Optimizar consulta MySQL: Join?

Publicado por xve (1151 intervenciones) el 05/01/2015 20:25:16
Hola Kibura, me cuesta bastante de entender tu consulta, pero te puedo decir, que MySQL es mucho mas rápido haciendo SELECT's sueltos que juntandolos con JOIN... por lo que depende de que cosas, de seguro que sale mas a cuenta hacer otros SELECT en vez de juntarlos con JOIN.

No se si esto te puede ayudar...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Optimizar consulta MySQL: Join?

Publicado por Kibura (2 intervenciones) el 07/01/2015 17:48:31
Hola xve!

Muchas gracias por tu respuesta :) Por desgracia ya he probado a hacer los Selects de forma independiente y, al menos en este caso concreto, la respuesta es aún más lenta.

No sé muy bien cómo explicarlo mejor: la idea es que se obtengan todos los productos englobados en una categoría (la cual tiene subcategorías y estas, a su vez, más subcategorías) que cumplan unos requisitos concretos (en este caso, cuya marca sea "ARMANI COLLEZIONI").

A ver si hay suerte y a alguien se le ocurre algo más ^^
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar