我这样做:
delete from calibration_2009 where rowid in
(SELECT rowid FROM `qcvalues`.`batchinfo_2009` where reporttime like "%2010%");
我需要删除大约250k行。
为什么需要这么长时间?有更快的方法吗?
答案 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语句