【问题标题】:What is the fastest way of deleting old data from MySQL?从 MySQL 中删除旧数据的最快方法是什么?
【发布时间】:2022-01-27 12:10:03
【问题描述】:

我有一个包含大量数据的表格,其中包含“创建时间”列。在此数据库中,在过去 3 年中创建了超过 12 000 000 行。我需要一次删除超过 3 个月的数据,一次 1000 个。从最旧的数据开始还是从最新的数据开始更好?

我通过灵活的搜索来做到这一点。这是最安全的方法,因为我们在我们的平台中使用我们自己的 ORM,并且与这些数据一起,其他有关系的数据将被删除。我不能全部复制。我不能做分区。只有一个问题:如何更快? mysql 是否以某种方式针对此类查询进行了优化?

【问题讨论】:

  • 如果您能够离线完成,我建议将不到 3 个月的数据复制到新表中,删除旧表并重命名新表。展望未来,我建议按日期将数据划分为多个段,这样您就可以简单地删除一个分区而不是删除单个行。
  • 请添加表定义以便我们查看索引。定义大量数据并预测 11 年 9 个月与 3 个月的数据分布。我希望您没有要删除的数据的 FK..
  • 是从最旧的数据开始还是从最新的数据开始更好? 最好删除数据而不进行任何排序,只检查日期,直到匹配“太旧的行” "条件缺席。 PS。不要在条件中使用 NOW(),仅使用 CURRENT_DATE。聚苯乙烯。为了进一步简化清理过程,您可以考虑按日期分区 - 这允许通过简单的旧分区删除来删除旧行。
  • 我通过灵活搜索来做到这一点。这是最安全的方法,因为我们在我们的平台中使用我们自己的 ORM,并且与这些数据一起,其他有关系的数据将被删除。我不能全部复制。我不能做分区。只有一个问题:如何更快? mysql 是否以某种方式针对此类查询进行了优化?
  • 如果您只想通过 ORM 工具执行删除,那么询问 MySQL 级别的任何优化是没有意义的。它将严格执行您的 ORM 将发送给它的查询。 只有一个问题:它会如何更快?在你的情况下 - 没有区别。

标签: mysql database


【解决方案1】:

诀窍不在于删除的顺序,而在于您如何定位要删除的行。请提供SHOW CREATE TABLE,以便我们查看有哪些INDEXes 可用并提供进一步建议。

从长远来看,您应该切换到PARITION BY RANGE(TO_DAYS(..)) 并拥有每个分区一个月的时间。然后DROP PARTITION 很快。

更多关于两者的讨论,以及其他技术:

Deletion
Partition

OFFSET 效率很低。

【讨论】:

  • "SELECT {" + CartModel.PK + "} FROM {" + CartModel._TYPECODE + "} WHERE {" + CartModel.MODIFIEDTIME + "}
  • @RomanLototskyi - 我看到 LIMIT 这个词 3 次;请修复。
  • 在“使用起来更好”之后只是我的评论。
猜你喜欢
  • 2019-07-12
  • 2012-03-17
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
相关资源
最近更新 更多