如何优化这个MySQL查询? (巨大延迟,以获得结果)

时间:2019-02-01 17:41:20

标签: mysql

我在执行此特定查询时遇到问题。我已经测试,发现有一个时间极大的浪费,得到的,因为其具有“OR”这些指令的查询。

请不要质疑我需要的信息,这是无法协商的。 我试图使用别名( “Suma_Bondiolas S / hueso”)命名,但我不可能。

感谢您的推荐。

在这里,你有3个东西。 1)在Heidi中查询的照片。 2)sql代码。 3)查询结果。

1)代码图像,可加快理解速度。

enter image description here

2)代码:

SELECT (ELT(WEEKDAY(fecha) + 1, 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo')) AS Día_Semana
    ,fecha AS 'Fecha_Desposte'
    ,IFNULL(ROUND((
            SELECT sum(kilos) 
            FROM rindes 
            WHERE (producto = 1625 OR producto = 1725 OR producto = 1695 OR producto = 1732 OR producto = 2001 OR producto = 2201) 
            AND fecha=Fecha_Desposte
        ),2),0) AS 'Suma_Bondiolas s/hueso'
    ,IFNULL(ROUND((
            SELECT sum(kilos) 
            FROM rindes 
            WHERE (producto = 1427 OR producto = 1527 OR producto = 1695 OR producto = 1698) 
            AND fecha=Fecha_Desposte
        ),2),0) AS 'Suma_huesos_Bondiola'
    ,( SELECT sum(kilos) 
        FROM rindes 
        WHERE (producto = 1625 OR producto = 1725 OR producto = 1695 OR producto = 1732 OR producto = 2001 OR producto = 2201) 
        AND fecha=Fecha_Desposte
    )/(SELECT sum(kilos) 
        FROM rindes 
        WHERE (producto = 1427 OR producto = 1527 OR producto = 1695 OR producto = 1698) 
        AND fecha=Fecha_Desposte
    ) as 'Huesos Bondiola/Bondiolas sin huesos' 
FROM rindes 
WHERE fecha >='2018-10-29' AND fecha <= '2019-01-30' 
GROUP BY Fecha_Desposte 
ORDER BY Fecha_Desposte DESC

3)结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

看起来像是条件聚合的候选者:

SELECT `Dia_Semana`, `Fetcha_Deposte`
   , IFNULL(ROUND(`Suma_Bondiolas s/hueso`, 2), 0) AS `Suma_Bondiolas s/hueso`
   , IFNULL(ROUND(`Suma_huesos_Bondiola`, 2), 0) AS `Suma_huesos_Bondiola`
   , `Suma_Bondiolas s/hueso` / `Suma_huesos_Bondiola` AS `Huesos Bondiola/Bondiolas sin huesos`
FROM (
    SELECT ELT(WEEKDAY(fecha) + 1, 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo') AS `Día_Semana`
     , fecha AS `Fecha_Desposte`
     , SUM(CASE WHEN producto IN (1625,1725,1695,1732,2001,2201) THEN kilos ELSE 0 END) AS `Suma_Bondiolas s/hueso`
     , SUM(CASE WHEN producto IN (1427,1527,1695,1698) THEN kilos ELSE 0 END) AS `Suma_huesos_Bondiola`
    FROM rindes 
    WHERE fecha >='2018-10-29' AND fecha <= '2019-01-30' 
    GROUP BY Fecha_Desposte, `Día_Semana`
) AS subQ
ORDER BY Fecha_Desposte DESC
;

请注意,此子查询格式不是严格必需的,但可以避免为最后一列重复前两个求和表达式。

此外,如果使用的产品ID值是数据的一小部分,则将AND producto IN ([all product ids in both sum expressions])添加到subQ的WHERE中也可以加快速度。我听说最近的MySQL版本已经对IN运算符进行了一些优化,但是我不确定它是否现在可以利用索引。但如果添加条件,则值得尝试为(fecha, producto)编制索引。