我正在从远程数据库中删除数十万行的行。每个删除都有自己的目标,例如。
DELETE FROM tablename
WHERE (col1=c1val1 AND col2=c2val1) OR (col1=c1val2 AND col2=c2val2) OR ...
这对我来说几乎是单个查询的两倍,但我想知道是否有办法加快速度,因为我没有使用SQL很长时间。
答案 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')...);