在我的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后台运行查询或删除这些记录的任何更快的步骤?
答案 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)可能会因锁而不断失败。