2

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

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

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

4

3 回答 3

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,假设列在两个表中的名称相同,并且您希望两个列都等于它们在连接表中的同名的连接条件。

于 2013-01-18T17:04:46.937 回答
0

一般来说,执行 bulk 最快DELETE的方法是将要删除的 id 放入某种临时表中,然后将其用作查询的一部分:

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

插入可以通过标准完成:

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

语句,或使用数据库的批量加载实用程序。

于 2013-01-18T17:05:09.480 回答
0

我怀疑它对性能有很大影响,但你可以这样写那种东西......

DELETE 
  FROM table
 WHERE (col1,col2) IN(('c1val1','c2val1'),('c1val2','c2val2')...);
于 2013-01-18T17:08:19.123 回答