删除查询花费的时间太长,无法执行

时间:2019-05-10 11:58:13

标签: mysql

我正在编写一个shell脚本,将XML文件中的数据加载到MySQL的7个不同的表中。 XML文件将根据特定条件加载到所有7个表中。所有7个表的属性都为“ PIK”。

我稍后检查所有表并删除在7个表中不通用的所有PIK。每个表需要10分钟。但是在从“ PROEntity”表中删除记录2个小时时卡住了。 有趣的是,“ PROEntity”表没有任何不常见的PIK。

这是我的查询:

mysql -v -u $Username -p$Password $database << EOF >> $ERRFile 2>&1

DELETE FROM ENTITY 
   where PIK not in 
      (select distinct(p.PIK)
          from 
             PRO p, 
             PRODET pd, 
             PROTH pt, 
             PROREW pr, 
             PROBUCK ppb, 
             PROENTITY_TEMP pbe, 
             PROMOST ps
          where 
                 p.PIK = pd. PIK 
             and pd.PIK = pt.PIK 
             and pt.PIK = pr.PIK 
             and pr.PIK = ppb.PIK 
             and ppb.PIK = pbe.PIK 
             and pbe.PIK=ps.PIK);

EOF

PROENTITY_TEMP包含与PROENTITY相同的数据。 我必须使用PROENTITY_TEMP,因为无法在嵌套查询中使用PROENTITY并从PROENTITY本身中删除。

我采用了相同的方法从所有其他表中删除,但是对该表的删除查询需要2个小时以上的时间(即使没有数据要删除)。

请帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

使用显式联接sintax,而不是(基于1992年的旧版)基于位置(这不是出于性能而是出于可读性)而使用隐式联接sintax

为了提高性能,请尝试在连接条件失败(为空)的左连接中更改NOT IN子句

delete from ENTITY 
LEFT JOIN (
  select distinct(p.PIK)
  from PRO p
  INNER JOIN PRODET pd ON p.PIK = pd. PIK 
  INNER JOIN PROTH pt ON pd.PIK = pt.PIK 
  INNER JOIN PROREW pr ON pt.PIK = pr.PIK 
  INNER JOIN PROBUCK ppb ON pr.PIK = ppb.PIK 
  INNER JOIN PROENTITY_TEMP pbe ON pb.PIK = pbe.PIK 
  INNER JOIN PROMOST ps ON be.PIK=ps.PIK 
) t on E.PIK = t.PIK 
WHERE t.PIK is null

最后确保您为JOIN所需的所有列均已正确索引