【问题标题】:Most efficient way to periodically delete all entries in database older than a month定期删除数据库中超过一个月的所有条目的最有效方法
【发布时间】:2012-01-11 21:13:32
【问题描述】:

我正在尝试最有效地管理数据库表并删除永远不会被访问的旧条目。是的,它们可能很容易持续多年,但我只想摆脱它们。我可能每个月都可以这样做一次。将我要保留的条目复制到新表中然后简单地删除旧表会更有效吗?或者查询是否应该在我设置的阈值之后手动删除每个条目。

我正在使用带有实体注释和 Java 持久性管理器的 JPA/JPQL JEE6 的 MySQL。

谢谢

【问题讨论】:

  • 如果我想保留的是整个表格的 2%。将它们复制到新表然后删除旧表是否更有意义?
  • stackoverflow.com/questions/8362362/… 中接受的答案有什么问题?
  • 这些不是如何删除项目的答案。回复建议永远不要删除这并不是问题的真正答案。提到删除的一个响应承认它效率低下。
  • 反复运行效率低下。如果您每月运行一次,谁在乎?
  • 这样的查询不会花费 O(n) 时间来比较每个值吗?有更快的方法吗?

标签: mysql database jpa jpql


【解决方案1】:

另一种解决方案是使用range or list PARTITIONING 设计表,然后您可以使用 ALTER TABLE 删除或截断旧分区。

这比使用 DELETE 快得多,但它可能会使表格的其他用途变得复杂。

【讨论】:

    【解决方案2】:

    单个删除查询将是最有效的解决方案。

    如果您要保留大量数据,则将数据从一个数据库复制到另一个数据库可能会很耗时。这意味着您必须使用单个查询(或多个,如果您想批处理)检索所有数据,并在另一个数据库中发出大量插入语句。

    使用 JPQL,您可以发出单个查询来删除所有旧语句,例如

    DELETE FROM Entity e WHERE e.date = ?
    

    这将转换为单个 SQL 查询,并且数据库将负责删除所有不需要的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2012-11-23
      相关资源
      最近更新 更多