我有一个cron设置来备份生产mysql表并期望定期从表中清除数据。我必须删除ids引用的多个表中的数据。
一些背景:我需要删除大约200万行,我的应用程序将不断读取/写入我的数据库(它通常不应该访问被删除的行)
我的问题是我应该如何在以下参数上构建删除查询:
答案 0 :(得分:0)
假设:
删除您拥有的查询是基于范围而非主索引。
删除一个事务中的所有行, 将有非常长的事务,以及更大的锁。这会增加复制延迟,复制延迟很差,新的DC会让它变得非常糟糕。拥有更大的锁也会降低写入吞吐量。 (如果是隔离级别Serializable,甚至读取吞吐量也可能会受到影响。)
批量删除。 比删除all更好,但是当范围发生删除时,每次删除的锁数会更多,(将采用间隙锁和下一行锁)。因此,批量范围内的删除也会有相同的问题。
与全部和批量删除相比,最好是批量执行。
其他做法:(我们需要在某个时间之前删除行) 1.拥有一个运行每个configured_time和的守护进程。 一世。从表中选择pk,其中purge-time<您的吹扫时间。 - 没有锁 II。基于pk删除,使用多个线程。 - 行级锁,小事务(跨表)。
此方法将确保较小的事务和仅行级锁定。 (基于主键删除只会采用行级锁定)。此外,您的查询很简单,因此即使部分删除成功,您也可以重新运行。我觉得这些原子不是必需的。
或
或者