How to optimize a query that contains two subquery in MySql?

1

I have the following query:

SELECT presupuestosd.partida,presupuestosd.valor, 
(SELECT SUM(presupuestosa.comprado) AS comprado FROM presupuestosa 
WHERE presupuestosa.obra=18 AND presupuestosa.empresa=1 AND  
presupuestosa.partida=presupuestosd.partida) AS c_cantidad,
(SELECT SUM(presupuestosa.compradov) AS compradov FROM presupuestosa 
WHERE presupuestosa.obra=18 AND presupuestosa.empresa=1 AND  
presupuestosa.partida=presupuestosd.partida) AS c_valores
FROM presupuestosd 
WHERE presupuestosd.obra=18 AND presupuestosd.empresa=1 ORDER BY 
presupuestosd.partida

I would like to know if there is the possibility of optimizing the query, since the amount of data takes about 40 seconds. If there is an idea, thank you already.

    
asked by Danilo 29.06.2018 в 18:27
source

1 answer

0

The only optimization that I can suggest based on the information you provide, is to replace the two subqueries with a single% of% that returns the desired sum. We would be replacing two subqueries for each row with a single one at the table level, for any other improvement we should already be analyzing, table structures, indexes and query / explain plans.

SELECT  presupuestosd.partida,
        presupuestosd.valor,
        IFNULL(PSA.c_cantidad,0) AS c_cantidad,
        IFNULL(PSA.c_valores,0)  AS c_valores
    FROM presupuestosd 
    LEFT JOIN ( SELECT  presupuestosa.empresa,
                presupuestosa.obra,
                presupuestosa.partida,
                SUM(presupuestosa.comprado) AS c_cantidad,
                SUM(presupuestosa.compradov) AS c_valores
                FROM presupuestosa 
                GROUP BY presupuestosa.empresa,
                    presupuestosa.obra,
                    presupuestosa.partida
        ) PSA
        ON PSA.empresa = presupuestosd.empresa
        AND PSA.obra = presupuestosd.obra
        AND PSA.partida = presupuestosd.empresa
    WHERE   presupuestosd.obra=18 
        AND presupuestosd.empresa=1 
    ORDER BY 
        presupuestosd.partida
    
answered by 29.06.2018 / 20:45
source