如何从mysql表中删除数百万条记录

时间:2017-06-24 07:22:13

标签: mysql database

在我的MySQL表中包含超过2000万条记录。我想通过运行

从较低的索引中删除它
delete FROM mydb.dailyreportdetails where idDailyReportDetails>0 order by idDailyReportDetails asc limit 1000 ;

在运行上述查询时,我收到了如下所述的错误

Operation failed: There was an error while applying the SQL script to the database.
ERROR 1205: 1205: Lock wait timeout exceeded; try restarting transaction
SQL Statement:

有没有办法在mysql后台运行查询或删除这些记录的任何更快的步骤?

3 个答案:

答案 0 :(得分:1)

您可以先找到要删除的实际ID ...

SELECT idDailyReportDetails 
    FROM mydb.dailyreportdetails 
    where idDailyReportDetails>0 
    order by idDailyReportDetails asc limit 1000,1 ;

然后使用select ...

中的值直接删除
DELETE FROM mydb.dailyreportdetails 
        where idDailyReportDetails < ID;

答案 1 :(得分:0)

您可以通过

检查InnoDB锁
SHOW ENGINE InnoDB STATUS;

然后你会得到状态或错误..

如果您想增加案件使用时间

set innodb_lock_wait_timeout=3000;

之后运行删除查询。

答案 2 :(得分:-1)

从表中删除行的最快方法是通过id引用它们。这对于二进制日志也是优选的。因此,最好的方法是使用一些编程语言并在循环中获取一组新的行ID,然后通过在WHERE idDailyReportDetails IN ()子句中明确声明它们来删除行。

如果数据库被其他进程使用,则范围查询(WHERE id&lt; something)可能会因锁而不断失败。