如何优化此查询以获得更快的结果?

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

如何优化此查询以更快地获得结果?

update TblPartes inner join (select TP.codigo1, COUNT(TE.id_codigo) AS COUNT FROM TblPartes TP left JOIN TblExistencias as TE ON TP.id=TE.id_codigo where TE.vendido = 0 or TE.vendido is null or TE.vendido = 0 and TP.id_ubicacion is null or TE.vendido is null and TP.id_ubicacion is null GROUP BY TP.id ) as E on TblPartes.codigo1=E.codigo1 set stock = E.count  where TblPartes.codigo1=E.codigo1
mysql query-optimization
1个回答
0
投票

问题归结为速度,对吗?

    SELECT  TP.codigo1, COUNT(TE.id_codigo) AS COUNT
            FROM  TblPartes TP
            left JOIN  TblExistencias as TE  ON TP.id=TE.id_codigo
            where  TE.vendido = 0
              or  TE.vendido is null
              or  TE.vendido = 0
              and  TP.id_ubicacion is null
              or  TE.vendido is null
              and  TP.id_ubicacion is null
            GROUP BY  TP.id 

建议:

  • 决定是否使用
    0
    NULL
    。这样查询就不必同时测试两者。 (这可能需要更改数据以及数据的加载方式。)
  • 注意,当
    COUNT(x)
    x
    时,
    NULL
    避免计数;这就是你想要的吗?
  • 您可以通过将
    GROUP BY
    变为
    LEFT JOIN
    来避免
    EXISTS(SELECT ...)
    (这可能是速度的一个重要因素)。
  • UPDATE
    正在测试
    TblPartes.codigo1=E.codigo1
    两次`。
  • 在长布尔表达式中添加括号是合适的 -
    and
    or
    可能不会按照您期望的方式组合!

请提供

SHOW CREATE TABLE
EXPLAIN SELECT ...

这些索引可能有帮助:

TP:  INDEX(id_ubicacion, id,  codigo1)
TE:  INDEX(vendido, id_codigo)
© www.soinside.com 2019 - 2024. All rights reserved.