我有一张表,其中有很多插入内容。 在我说出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
中的所有建议答案 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
或者...
您可以随时执行REPLACE
。 REPLACE
分两步:DELETE
在UNIQUE
(包括PRIMARY
)键上匹配的任何行,然后是INSERT
。