首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从mysql表中清除数据

从mysql表中清除数据
EN

Stack Overflow用户
提问于 2015-04-17 14:21:45
回答 1查看 2.8K关注 0票数 2

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

一些背景:我需要删除大约200万行,我的应用程序将不断地读/写到我的db(它通常不应该访问被删除的行)

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

  1. 单次大容量查询中的删除还是批量删除?
  2. 在单个事务中跨不同表的删除与不使用任何事务的删除。如果在事务中使用delete,即使在批处理中删除,也会出现表级锁吗?
  3. 我没有设置任何分区,是否会出现碎片问题?
EN

回答 1

Stack Overflow用户

发布于 2015-04-18 10:28:37

假设:

  1. 隔离级别:可重复读取-默认Mysql隔离级别。
  2. 删除查询是基于范围而不是主索引的。
  3. 删除一个事务中的所有行,将具有非常长的事务,以及更大的锁。这将增加复制滞后,复制滞后是坏的,新的DC使其变得非常糟糕。拥有更大的锁也会降低您的写入吞吐量。(在隔离级别上,Serializable甚至读取吞吐量也可能受到影响。)
  4. 批量删除。比删除所有更好,但随着范围的删除,每次删除的锁数都会更多(将采用间隙锁和下一行锁)。因此,删除在批处理范围内也会有同样的问题,只是更小。

与全部删除和批处理相比,批量执行更好。

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

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

  1. 降低您的隔离级别:然后,使用批处理删除,您应该可以使用READ_COMMITED。在读交换隔离中,即使在通过辅助密钥访问时,锁也只能排在行上。

  1. 如果您的模型允许基于时间的碎片并删除db本身:)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29701878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档