从mysql中删除数据的最快方法

时间:2010-05-21 17:59:14

标签: sql mysql

我这样做:

delete from calibration_2009 where rowid in
(SELECT rowid FROM `qcvalues`.`batchinfo_2009` where reporttime like "%2010%");

我需要删除大约250k行。

为什么需要这么长时间?有更快的方法吗?

4 个答案:

答案 0 :(得分:1)

如果reporttime是DATETIME,请使用:

DELETE FROM calibration_2009 
 WHERE rowid IN (SELECT rowid 
                   FROM `qcvalues`.`batchinfo_2009` 
                  WHERE reporttime BETWEEN STR_TO_DATE('2010-01-01', '%Y-%m-%d') 
                                       AND STR_TO_DATE('2010-12-31', '%Y-%m-%d'))

答案 1 :(得分:1)

根据内部选择返回的行数,您必须在calibration_2009中每行进行多次比较,以确定是否必须删除它。

如果内部选择返回250k行,那么你在calibration_2009中每行最多进行250k比较,看看是否应删除该行。

我想说更快的方法是将一个列添加到calibration_2009,如果可能的话,调用to_be_deleted。然后更新该表

UPDATE calibration_2009 SET to_be_deleted = EXISTS (
  SELECT 1 FROM `qcvalues`.`batchinfo_2009`
  WHERE `batchinfo_2009.rowid = calibration_2009.rowid AND batchinfo_2009.reporttime like "%2010%"
  );

如果两个表都由batchinfo_2009中的rowid和reporttime索引,那么这应该很快。

然后只是

DELETE FROM calibration_2009 WHERE to_be_deleted = 1;

然后您可以删除该新字段,或将其保留在那里以供将来更新。

答案 2 :(得分:1)

DELETE  c
FROM    `qcvalues`.`batchinfo_2009` b
JOIN    calibration_2009 c
ON      c.rowid = b.rowid
WHERE   b.reporttime LIKE '%2010%';

你应该在calibration_2009 (rowid)上有一个索引,以便快速工作。

我认为无论如何它都是PRIMARY KEY,但你最好检查一下。

答案 3 :(得分:0)

不确定这是否是有效的inn mysql但你试过吗

delete from calibration_2009 a inner join qcvalues.batchinfo_2009 b on a.rowid = b.rowid where reporttime like '%2010%'

或者,如果年份部分位于报告时间内的固定位置,请尝试使用子字符串和等号,而不是使用LIKE语句