我有一张包含1000万条记录的表,删除和删除的最快方法是什么?保留最近30天。
我知道这可以在事件调度程序中完成,但我担心的是如果花费太多时间,它可能会锁定表很长时间。
如果你能提出一些最佳方法,那就太好了。
感谢。
答案 0 :(得分:5)
随便,我会:
这样,您就可以在整个过程中保持整个过程,并在闲暇时间内获取过去30天的数据。
答案 1 :(得分:4)
您可以尝试分区表。
PARTITION BY LIST (TO_DAYS( date_field ))
这将为您提供每天1个分区,当您需要修剪数据时:
ALTER TABLE tbl_name DROP PARTITION p#
答案 2 :(得分:1)
并不是它可以帮助您解决当前的问题,但如果这是一个经常出现的问题,您可能需要查看merge table:只需添加不同时间段的表,并将其从{{{{}}中移除1}}不再需要时的表定义。另一个选项是partitioning,其中删除(最旧的)分区同样微不足道。
答案 3 :(得分:1)
扩展Michael Todd的答案。
如果你有空间,
假设: table是要从中清除大量数据的表的表名 newtable是临时表名称 没有其他表被称为temptable
rename table table to temptable, newtable to table;
drop temptable;
这将在单个事务中完成,这将需要瞬时模式锁定。大多数高并发应用程序都不会注意到这种变化。
或者,如果您没有空间,并且有一个很长的窗口来清除此数据,则可以使用动态sql将主键插入临时表,并将临时表连接到delete语句中。插入临时表时,请注意max_packet_size是什么。大多数MySQL安装使用16MB(16777216字节)。 temp表的insert命令应该在max_packet_size下。这不会锁定表格。您将需要运行优化表来回收空间以供其他引擎使用。您可能无法回收磁盘空间,除非您要关闭引擎并移动数据文件。
答案 4 :(得分:0)
关闭资源,
SELECT .. INTO OUTFILE
,解析输出,删除表,LOAD DATA LOCAL INFILE optimized_db.txt
- 重新创建比更新更便宜。