删除MySQL中的很多行

时间:2013-01-18 16:57:16

标签: mysql sql database

我正在从远程数据库中删除数十万行的行。每个删除都有自己的目标,例如。

DELETE FROM tablename
WHERE (col1=c1val1 AND col2=c2val1) OR (col1=c1val2 AND col2=c2val2) OR ...

这对我来说几乎是单个查询的两倍,但我想知道是否有办法加快速度,因为我没有使用SQL很长时间。

3 个答案:

答案 0 :(得分:6)

创建一个临时表,并用所有值对填充,每行一个。将列命名为与table中的匹配列相同。

CREATE TEMPORARY TABLE donotwant (
  col1 INT NOT NULL,
  col2 INT NOT NULL,
  PRIMARY KEY (c1val, c2val)
);

INSERT INTO donotwant VALUES (c1val1, c2val1), (c1val2, c2val2), ...

然后根据这些表之间的JOIN执行多表删除:

DELETE t1 FROM `tablename` AS t1 JOIN `donotwant` USING (col1, col2);

USING子句是ON t1.col1=donotwant.col1 AND t1.col2=donotwant.col2的简写,假设两个表中的列名称相同,并且您希望连接条件中两个列在连接表中等于它们的同名。

答案 1 :(得分:0)

一般来说,批量DELETE的最快方法是将要删除的ID放入某种临时表中,然后将其作为查询的一部分使用:

DELETE FROM table
WHERE (col1, col2) IN (SELECT col1, col2
                       FROM tmp)

可以通过标准进行插入:

INSERT INTO tmp VALUES (...), (...), ...;

语句,或使用DB的批量加载实用程序。

答案 2 :(得分:0)

我怀疑它对性能有多大影响,但你可以用这种方式写出那种东西......

DELETE 
  FROM table
 WHERE (col1,col2) IN(('c1val1','c2val1'),('c1val2','c2val2')...);