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