Mysql如何通过子查询和求和来优化查询?

问题描述 投票:0回答:1

祝你有美好的一天。我有以下查询,需要很长时间才能执行:

SELECT
    formapago.codigos,
    formapago.cuentacte AS cargos,
    IFNULL(
        (SELECT SUM(IF(referencias.tipodoc IN (00,61),
                        referencias.valor,
                        referencias.valor*-1
                        ) - IFNULL((SELECT SUM(IF(ref.tipodoc IN (56),ref.valor,ref.valor*-1)) 
                                                        FROM referencias ref 
                                                        WHERE ref.empresa IN(SELECT codigo 
                                                                            FROM intituciones 
                                                                            WHERE codigos = 76291019) 
                                                        AND ref.codigos = referencias.codigos 
                                                        AND ref.tipodoc IN(56,61) 
                                                        AND ref.tipodocref = referencias.tipodoc 
                                                        AND ref.numerodocref = referencias.numerodoc),0)) 
        FROM referencias 
        WHERE referencias.empresa IN (SELECT codigo 
                                        FROM intituciones 
                                        WHERE codigos = 76291019) 
        AND referencias.codigos = formapago.codigos 
        AND referencias.tipodoc IN(00,56,61) 
        AND referencias.tipodocref = formapago.tipodoc 
        AND referencias.numerodocref = formapago.numerodoc),0) AS abonos 
FROM formapago 
LEFT JOIN condicionesp ON IF(formapago.condiciondep=0,1,formapago.condiciondep)=condicionesp.codigo 
LEFT JOIN clientes ON formapago.codigos = clientes.codigos 
WHERE formapago.empresa = 2 
AND formapago.codigos = 77155568 
AND formapago.tipodoc IN (33,34,35,39) 
AND formapago.cuentacte <> 0 
HAVING cargos<>abonos

大约需要20秒

我需要知道是否有可能优化查询,也许可以改变某种获取子查询的方式。

我放置机构的表格与称为公司的表格相同,在照片中出现

感谢任何帮助,问候并感谢您的关注。

sql mysql query-optimization
1个回答
0
投票

您想要一个索引来快速找到相关的格式。您正在寻找特定的 codigo,我认为该列是相当有选择性的,即没有太多行共享相同的 codigo。这是我建议的索引:

create index idx1 on formapago(codigos, empresa, tipodoc, cuentacte)

然后,使用格式选择相关参考文献,并使用这些参考文献,使用相同的列选择子参考文献。这是这些列的索引,再次从 codigos 开始,我认为它是最具选择性的列。

create index idx2 on referencias(codigos, numerodocref, tipodocref, tipodoc, empresa)

此外,您有两个外连接,但您没有在查询中使用表,因此只需删除这两行:

LEFT JOIN condicionesp ON IF(formapago.condiciondep=0,1,formapago.condiciondep)=condicionesp.codigo 
LEFT JOIN clientes ON formapago.codigos = clientes.codigos 
© www.soinside.com 2019 - 2024. All rights reserved.