祝你有美好的一天。我有以下查询,需要很长时间才能执行:
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秒
我需要知道是否有可能优化查询,也许可以改变某种获取子查询的方式。
感谢任何帮助,问候并感谢您的关注。
您想要一个索引来快速找到相关的格式。您正在寻找特定的 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