繁体   English   中英

从mysql表中清除数据

[英]Purging data from mysql tables

我有一个cron设置,用于备份生产mysql表,并希望定期清除表中的数据。 我必须删除ID引用的多个表中的数据。

一些背景:我需要删除大约200万行,并且我的应用程序将不断读取/写入我的数据库(尽管它通常不应该访问要删除的行)

我的问题是如何在以下参数上构造删除查询:

  1. 在单个批量查询中删除还是批量删除?
  2. 在单个事务中跨不同表进行删除与不使用任何事务进行删除相比。 即使我批量删除,如果在事务中使用Delete,是否会有表级锁?
  3. 我没有设置任何分区,碎片会成为问题吗?

假设:

  1. 隔离级别:可重复读取-默认Mysql隔离级别。
  2. 删除基于范围而不是主索引的查询。

  3. 删除一个事务中的所有行,将具有很长的事务和更大的锁。 这会增加复制滞后,复制滞后不好,新的DC使其变得很糟糕。 拥有更大的锁也将降低您的写入吞吐量。 (在隔离级别可序列化的情况下,甚至读取吞吐量也可能会受到影响。)

  4. 批量删除。 比全部删除要好,但是随着范围的删除发生,每次删除的锁数会更多(将使用间隙锁和下一行锁)。 因此,按范围批量删除也将具有较小的相同问题。

与全部删除相比,批处理更可取。

其他方法:(我们需要在某个时间之前删除行)1.有一个守护进程,它运行每个configure_time和。 一世。 从表中选择pk,其中清除时间<您的清除时间。 -无锁ii。 使用多个线程基于pk删除。 -行级锁,小事务(跨表)。

这种方法将确保较小的事务,并且仅行级锁。 (基于主键的删除只会采用行级锁)。 您的查询也很简单,因此即使部分删除成功,您也可以重新运行。 我觉得这些原子不是必需的。

要么

  1. 降低隔离级别:对于READ_COMMITED,即使是批量删除,也应该没问题。 在Read COMMITED隔离中,即使通过辅助键访问,锁也仅在行上。

要么

  1. 如果您的模型允许基于时间的分片并删除数据库本身:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM