Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除MySQL中的许多行_Mysql_Sql_Database - Fatal编程技术网

删除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上进行了测试,效果很好。