[英]Purging data from mysql tables
我有一个cron设置,用于备份生产mysql表,并希望定期清除表中的数据。 我必须删除ID引用的多个表中的数据。
一些背景:我需要删除大约200万行,并且我的应用程序将不断读取/写入我的数据库(尽管它通常不应该访问要删除的行)
我的问题是如何在以下参数上构造删除查询:
假设:
删除基于范围而不是主索引的查询。
删除一个事务中的所有行,将具有很长的事务和更大的锁。 这会增加复制滞后,复制滞后不好,新的DC使其变得很糟糕。 拥有更大的锁也将降低您的写入吞吐量。 (在隔离级别可序列化的情况下,甚至读取吞吐量也可能会受到影响。)
批量删除。 比全部删除要好,但是随着范围的删除发生,每次删除的锁数会更多(将使用间隙锁和下一行锁)。 因此,按范围批量删除也将具有较小的相同问题。
与全部删除相比,批处理更可取。
其他方法:(我们需要在某个时间之前删除行)1.有一个守护进程,它运行每个configure_time和。 一世。 从表中选择pk,其中清除时间<您的清除时间。 -无锁ii。 使用多个线程基于pk删除。 -行级锁,小事务(跨表)。
这种方法将确保较小的事务,并且仅行级锁。 (基于主键的删除只会采用行级锁)。 您的查询也很简单,因此即使部分删除成功,您也可以重新运行。 我觉得这些原子不是必需的。
要么
要么
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.