我有一张拥有1000万条记录的表格,最后30天保留的最快删除方法是&。有没有办法在mysql中做批量/更快的删除?
我知道这可以在事件调度程序中完成,但是我担心如果需要太多时间,它可能会锁定表格很长时间。
如果您能提出一些最佳方法,那将会很棒。
谢谢。
我有一张拥有1000万条记录的表格,最后30天保留的最快删除方法是&。有没有办法在mysql中做批量/更快的删除?
我知道这可以在事件调度程序中完成,但是我担心如果需要太多时间,它可能会锁定表格很长时间。
如果您能提出一些最佳方法,那将会很棒。
谢谢。
关闭您的资源, SELECT .. INTO OUTFILE
,解析输出,删除表,LOAD DATA LOCAL INFILE optimized_db.txt
- 比更新更便宜重新创建。
谢谢,我使用select into&load数据在可以删除记录之前进行数据备份。它需要删除7-8百万条记录,而需要备份1000万条记录才能进行归档。 – Sharpeye500 2010-09-27 22:15:39
随口说说,我想:
钍将使您能够通过(几乎)整个过程保持桌面的正常运行,并在您的闲暇时间内获取过去30天的数据。
根据数据需要的可用性,另一个选项是1.将最近30天抓到新表中2.切换两个表(所以新表是主要表)3.移动添加的所有内容在切换过程中旧桌子(可能很少)。 – 2010-09-27 22:14:39
@Brendan这当然是更容错的解决方案。 – 2010-09-27 22:15:45
不需要自动化。我不能重命名该表,因为它可以通过应用程序访问它。 – Sharpeye500 2010-09-27 22:16:31
不,它可以帮助你当前的问题,但如果这是一个普通的次数,你可能想寻找到一个merge table:只需添加表在不同的时间段,并从merge
表定义删除它们时,没有更长的需要。另一种选择是partitioning,其中删除(最早的)分区同样微不足道。
你可以尝试分区表。
PARTITION BY LIST (TO_DAYS(date_field))
这将使你每天1个分区,当你需要修剪的数据,你只是:
ALTER TABLE tbl_name DROP PARTITION p#
要在迈克尔·托德的回答扩大。
如果你有空间,
双重重命名假设: 表是表的表名要清除从大量的数据中 newtable的是临时表名 没有其他的表称为不是Temptable
rename table table to temptable, newtable to table;
drop temptable;
这将在一个单一的交易,这将需要一个瞬间模式锁来完成。大多数高并发应用程序不会注意到这一变化。
或者,如果您没有空间,并且您有一个很长的窗口来清除此数据,则可以使用动态sql将主键插入临时表中,并在删除语句中加入临时表。当您插入临时表时,请注意max_packet_size是什么。大多数MySQL的安装使用16MB(16777216字节)。您对temp表的插入命令应该在max_packet_size下。这不会锁定表格。您需要运行优化表来回收引擎剩余部分使用的空间。除非您要关闭引擎并移动数据文件,否则您可能无法回收磁盘空间。
@ Sharpeye500 - 一旦您将表格缩小到仅仅30天的数据,剩下多少条记录?千万? – 2010-09-27 22:09:03
它会在1万左右。 – Sharpeye500 2010-09-27 22:10:00
你有自动确认,设置交易等...? – MikeAinOz 2010-09-27 22:28:32