我正在从远程数据库中删除数十万行。每个删除都有自己的目标,例如。
DELETE FROM tablename
WHERE (col1=c1val1 AND col2=c2val1) OR (col1=c1val2 AND col2=c2val2) OR ...
这对我来说几乎是单个查询的两倍,但我想知道是否有办法加快速度,因为我使用 SQL 的时间不长。
创建一个临时表并用所有值对填充它,每行一个。将列命名为与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
,假设列在两个表中的名称相同,并且您希望两个列都等于它们在连接表中的同名的连接条件。
一般来说,执行 bulk 最快DELETE
的方法是将要删除的 id 放入某种临时表中,然后将其用作查询的一部分:
DELETE FROM table
WHERE (col1, col2) IN (SELECT col1, col2
FROM tmp)
插入可以通过标准完成:
INSERT INTO tmp VALUES (...), (...), ...;
语句,或使用数据库的批量加载实用程序。
我怀疑它对性能有很大影响,但你可以这样写那种东西......
DELETE
FROM table
WHERE (col1,col2) IN(('c1val1','c2val1'),('c1val2','c2val2')...);