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!!
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


0