您好我想要删除一张有10百万条记录的表的所有记录,但它挂起并给我跟踪错误:
Lock wait timeout exceeded; try restarting transaction
我使用以下查询:
delete from table where name = '' order by id limit 1000
in for循环。
请建议我如何优化它。
答案 0 :(得分:3)
你说i want to delete all record of a table which have 10 millions record
。那么为什么不使用TRUNCATE
命令代替最小/没有日志记录的开销。
TRUNCATE TABLE tbl_name
您也可以使用DELETE
语句,但在您的情况下,条件检查(where name = '' order by id limit 1000
)不是必需的,因为您想要删除所有行,但DELETE
有记录开销在事务日志中,这可能对数百万的记录量有影响。
根据您的评论,您没有其他选择,而不是delete from table1 where name = 'naresh'
。您可以使用LIMIT
运算符(例如delete from table1 where name = 'naresh' limit 1000
)删除数据块。因此,如果name='naresh'
匹配25000行,则只会删除1000行。
您可以在循环中包含相同的内容,如下所示(未经过测试,可能需要进行小调整)
DECLARE v1 INT;
SELECT count(*) INTO v1 FROM table1 WHERE name = 'naresh';
WHILE v1 > 0 DO
DELETE FROM table1 WHERE name = 'naresh' LIMIT 1000;
SET v1 = v1 - 1000;
END WHILE;
所以在上面的代码中,循环将运行25次,每次删除1000行(假设name='naresh'
条件返回25K行)。
答案 1 :(得分:0)
如果要删除所有记录(空表), 你可以使用
TRUNCATE TABLE `table_name_here`...
可能会对你有用...... (没有尝试过大数据库)