删除MySQL中的许多行
我正在从远程数据库中删除数十万行。每次删除都有自己的目标,例如删除MySQL中的许多行,mysql,sql,database,Mysql,Sql,Database,我正在从远程数据库中删除数十万行。每次删除都有自己的目标,例如 DELETE FROM tablename WHERE (col1=c1val1 AND col2=c2val1) OR (col1=c1val2 AND col2=c2val2) OR ... 对我来说,这几乎是单个查询速度的两倍,但我想知道是否有办法加快速度,因为我使用SQL的时间不长。创建一个临时表,并用所有值对填充它,每行一个。将列命名为与表中匹配的列相同的列 CREATE TEMPORARY TABLE donotwan
DELETE FROM tablename
WHERE (col1=c1val1 AND col2=c2val1) OR (col1=c1val2 AND col2=c2val2) OR ...
对我来说,这几乎是单个查询速度的两倍,但我想知道是否有办法加快速度,因为我使用SQL的时间不长。创建一个临时表,并用所有值对填充它,每行一个。将列命名为与
表中匹配的列相同的列
CREATE TEMPORARY TABLE donotwant (
col1 INT NOT NULL,
col2 INT NOT NULL,
PRIMARY KEY (c1val, c2val)
);
INSERT INTO donotwant VALUES (c1val1, c2val1), (c1val2, c2val2), ...
然后根据这些表之间的联接执行多表删除:
DELETE t1 FROM `tablename` AS t1 JOIN `donotwant` USING (col1, col2);
USING子句是t1.col1=donotwant.col1和t1.col2=donotwant.col2的的简写,假设两个表中的列名称相同,并且您希望两个列在联接表中的联接条件相同。一般来说,批量DELETE
s的最快方法是将要删除的ID放入某种临时表中,然后将其用作查询的一部分:
DELETE FROM table
WHERE (col1, col2) IN (SELECT col1, col2
FROM tmp)
可通过以下标准进行插入:
INSERT INTO tmp VALUES (...), (...), ...;
语句,或者使用DB的大容量加载实用程序。我怀疑它对性能有多大影响,但您可以这样编写这种东西
DELETE
FROM table
WHERE (col1,col2) IN(('c1val1','c2val1'),('c1val2','c2val2')...);
之后如何处理临时表?创建临时表的会话结束时,临时表会自动删除。我似乎很难做到这一点,你能澄清你最后一行的语法吗?@Submarker,我对上述内容进行了具体编辑,并使用了与原问题相同的表名tablename
。当然,将其更改为要从中删除的表的真实名称。我在MySQL 5.5上进行了测试,效果很好。