MySQL回收表 - 自动替换而不是插入

时间:2018-03-14 09:56:54

标签: mysql innodb

我有一张表,其中有很多插入内容。 在我说出1,000,000行后,我不再关心第一行,并想要删除它们。 不幸的是,由于插入率很高,删除时间太长。

为了解决这个问题,我想知道以下是否可行 - 伪代码:

on insert:
    if id % 1,000,000 != id:
        do replace instead of insert with id = (id % 1,000,000)

通过这种方式,表格可以排序"循环"从顶部回来,并没有必要删除。

任何解决方案都必须考虑并发插入的可能性。

这样的事情可能吗?

编辑:

有关删除方法的所有未来建议 - 我已尝试使用http://mysql.rjweb.org/doc.php/deletebig

中的所有建议

2 个答案:

答案 0 :(得分:0)

您所描述的内容是可能的,但重复使用id值通常不是一个好习惯。

我建议您删除较小批量的行。

假设您要删除ID为<的所有行? 800000

DELETE FROM mytable WHERE id < 800000 LIMIT 1000;

然后在循环中执行此操作,直到受影响的为0。

您还可以在循环中添加一个简短的睡眠,以允许删除逐渐发生,而不会对数据库服务器造成太大负担。

您可能还想在免费的Percona Toolkit中试用pt-archiver这是一个旨在完成这种逐步修剪的脚本。

pt-archiver --purge --where "id < 800000" --source h=myserver,D=mydatabase,t=mytable

答案 1 :(得分:0)

PARTITIONing将是&#34;删除旧&#34;的最佳方式东西。我在这里解释一下细节:http://mysql.rjweb.org/doc.php/partitionmaint但是,最初设置它会需要一些停机时间。好处是定期DELETEs被近瞬时DROP PARTITION取代。

可以在块中DELETE,对系统的影响最小。我在这里讨论分块:http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

或者...

您可以随时执行REPLACEREPLACE分两步:DELETEUNIQUE(包括PRIMARY)键上匹配的任何行,然后是INSERT