在完成之前停止MySQL删除查询

时间:2013-12-01 01:56:44

标签: mysql

我试图从我的MySQL表中删除2亿行的一些行。虽然它在开始时工作正常,但几个小时后它会大幅减速。我希望我现在可以停止查询并重新启动它,从而使它更快地发生。之后我的数据库会保持不变吗?

3 个答案:

答案 0 :(得分:3)

您可以通过终止当前删除操作来终止当前删除操作。为此,您可以使用已经提到的其他会话发出的KILL语句,或者如果您的删除是从某些客户端代码(例如php)发出的,则终止客户端进程。

完整的含义并不十分清楚。如果你的意思是你的表的完整性,那么它应该是完整的。如果你的意思是它将被回滚,那么它取决于发布删除的上下文。

要在批量中断后删除剩余的行并假设您从一个表中DELETE(意味着您没有使用多表语法),您可以尝试使用LIMIT子句。

DELETE 
  FROM table_name
 WHERE ...
 LIMIT 10000 -- or any other appropriate batch size

通过这种方式,您每次可以删除n(10000)行。

答案 1 :(得分:1)

请参阅有关文档的KILL章节。

  

KILL [CONNECTION | QUERY] thread_id

     

每个与mysqld的连接都在运行   一个单独的线程。您可以使用SHOW查看正在运行的线程   PROCESSLIST语句并使用KILL thread_id终止一个线程   言。

     

在UPDATE或DELETE操作期间,之后检查kill标志   读取每个块以及每个更新或删除的行后。如果杀了   标志已设置,语句已中止。请注意,如果您不使用   事务中,更改不会回滚。

答案 2 :(得分:0)

你可以像这样使用Mysql命令行客户端

mysql> show processlist;
+----+--------+-----------------+--------+---------+------+-------+-------------
-----+
| Id | User   | Host            | db     | Command | Time | State | Info
     |
+----+--------+-----------------+--------+---------+------+-------+-------------
-----+
|  2 | adroit | localhost:49857 | dbname | Sleep   |  339 |       | NULL
     |
|  3 | adroit | localhost:49858 | dbname | Sleep   |  339 |       | NULL
     |
|  4 | root   | localhost:50175 | NULL   | Query   |    0 | init  | show process
list |
+----+--------+-----------------+--------+---------+------+-------+-------------
-----+
3 rows in set (0.00 sec)

mysql> kill 2;
Query OK, 0 rows affected (0.00 sec)

这里发生的事情只是使用show processlist命令显示mysql运行的所有进程的进程列表。 然后简单地在进程ID上执行kill命令,如上所示。