首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从大表中删除大量记录的有效方法

从大表中删除大量记录的有效方法
EN

Stack Overflow用户
提问于 2011-03-25 08:47:31
回答 3查看 16.3K关注 0票数 1

我想从我的MySql DB中的大表(~500 K记录)中删除大量的记录(~200 K)。

我希望尽可能高效地进行这个调用,因为我不希望DB在执行调用时变得“没有响应”。我需要删除超过10天(根据created_at栏)的记录,目前我使用:

代码语言:javascript
复制
delete from table_name where created_at < DATE_SUB(CURDATE(),INTERVAL 10 DAY)

如果有帮助,该表还具有主键id

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-25 09:07:30

有一个WHERE条件,在created_at字段上添加一个索引。

票数 4
EN

Stack Overflow用户

发布于 2013-08-10 08:43:46

我也面临着同样的挑战。没有主键,但在created_at字段上有索引,因此无法从100 row行表(InnoDB)中删除最古老的10 row条目。由于该表处于联机状态,并且仍然接收插入,因此在锁溢出时,它经常失败。

为了解决这个问题,我创建了一个存储过程,它以增量的方式处理作业:

代码语言:javascript
复制
mysql> CREATE PROCEDURE delete_accesslog_incrementally()
-> MODIFIES SQL DATA
-> BEGIN
-> REPEAT
-> DELETE FROM tbl_name
-> WHERE created_at < DATE_SUB(CURDATE(),INTERVAL 10 day)
-> LIMIT 20000;
-> UNTIL ROW_COUNT() = 0 END REPEAT;
-> END $$

这仍然会运行很长一段时间,但不会损害仍然命中表的并发插入。

票数 13
EN

Stack Overflow用户

发布于 2012-01-04 12:45:15

你可以试试这个:

1)首先查找所需日期的第一个id值:

代码语言:javascript
复制
select id from table_name where created_at = DATE_SUB(CURDATE(),INTERVAL 10 DAY) LIMIT 1;

2)下一批删除:

代码语言:javascript
复制
DELETE FROM table_name where id<"id_found_on_step_1" LIMIT 1000; 

在id_found_on_step_1上,将您在步骤1中找到的id值放在第1步。您可以尝试10000或低于1000。这取决于每个delete命令所需的时间。

这个删除应该更快,因为它的WHERE语句使用主键。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5430256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档