有没有办法在mysql中进行批量/更快的删除?
我有一个有1000万条记录的表,在过去30天里,删除和保留记录的最快方式是什么 我知道这可以在事件调度器中完成,但我担心的是,如果占用太多时间,它可能会锁定表很长时间 如果你能建议一些最佳的方法,那就太好了 谢谢。关闭您的资源,有没有办法在mysql中进行批量/更快的删除?,mysql,Mysql,我有一个有1000万条记录的表,在过去30天里,删除和保留记录的最快方式是什么 我知道这可以在事件调度器中完成,但我担心的是,如果占用太多时间,它可能会锁定表很长时间 如果你能建议一些最佳的方法,那就太好了 谢谢。关闭您的资源, 选择。。进入OUTFILE、解析输出、删除表、加载数据本地填充优化的\u db.txt——重新创建比更新更便宜 我会立即: 重命名该表 创建一个空表,其名称与 原始表格 从“临时”表中提取最后30天并插入 把它们放回新桌子上 放下临时表 这将使您能够(几乎)在整个过程中
选择。。进入OUTFILE
、解析输出、删除表、加载数据本地填充优化的\u db.txt
——重新创建比更新更便宜 我会立即:
这将使您能够(几乎)在整个过程中保留表格,并在空闲时获取过去30天的数据。这并不是说它可以帮助您解决当前的问题,但如果这是经常发生的情况,您可能需要研究a:只需在不同的时间段添加表格,当不再需要时,将它们从
合并表定义中删除。另一种选择是,删除(最旧的)分区同样简单。您可以尝试分区表
PARTITION BY LIST (TO_DAYS( date_field ))
这将为您每天提供1个分区,当您需要修剪数据时,您只需:
ALTER TABLE tbl_name DROP PARTITION p#
进一步阐述迈克尔·托德的答案
如果你有空间
创建一个与要缩小的表相似的空白临时表
在暂存表中仅填写您希望在目标表中保留的记录
按如下方式进行双重重命名
假设:
table是要从中清除大量数据的表的表名
newtable是临时表的名称
没有其他表被称为诱惑
rename table table to temptable, newtable to table;
drop temptable;
这将在单个事务中完成,这将需要一个即时模式锁。大多数高并发性应用程序不会注意到这一变化
或者,如果您没有空间,并且有一个长窗口来清除此数据,则可以使用动态sql将主键插入临时表,并在delete语句中连接临时表。插入临时表时,请注意最大数据包大小。大多数MySQL安装使用16MB(16777216字节)。临时表的insert命令应小于max_packet_size。这不会锁住桌子。您需要运行优化表以回收空间供引擎的其余部分使用。除非关闭引擎并移动数据文件,否则您可能无法回收磁盘空间。@Sharpeye500-一旦将表的数据量减少到仅30天,将剩下多少条记录?1000万?您是否有自动提交、设置事务等功能?根据数据的可用性,另一个选项是1。将过去30天的时间放在新的表2中。切换两个表(使新表成为主表)3。移动在切换期间添加到旧表中的任何内容(可能很少)。@Brendan这肯定是一个更具容错性的解决方案。不,这必须是自动化的。我无法重命名该表,因为它由应用程序访问。谢谢,在删除记录之前,我会使用select into&load data进行数据备份。它需要删除700-800万条记录,而为了存档需要备份1000万条记录。