定期定期高效删除大量(400万行)mysql数据


10

我们有一个mysql表,该表在任何给定时间都有大约1200万行。我们需要删除旧数据,以使表的大小易于管理。

现在,我们每天在午夜使用cron作业运行此查询:

DELETE FROM table WHERE endTime < '1393632001'

上一次运行查询时,它检查了4,602,400,耗时3分钟,CPU瘫痪。

午夜CPU峰值

在仍然清除旧数据的同时,如何使CPU,同步数据库连接,磁盘提示深度等不会出现不合理的变化?

PS:您会注意到,查询实际上是在使用周期中的不适当时间进行的。假设我们已经将查询的时间更改为每天使用的最低点。另外,“ endTime”上没有索引,如果可能的话,我宁愿保持这种方式,因为有很多数据被非常定期地插入,并且查找不多。

php  mysql 

也许使用cron作业每10分钟,每轮100k或每5分钟每轮50k删除

定期更小的块?

好的,但是看起来这可能只会长时间破坏我们的用户体验:)我们可以做明智的查询/设计吗?

1
186k用户,没有专门的数据库专家?

1
您将在“数据库管理员”上得到更好的答案
James Anderson 2014年

Answers:


13

问题的解决方案是一种称为“分区”的MySQL功能。文档在这里

分区的作用是将一个表存储在单独的“分区”中。这些由特定的表达式定义,通常是列值或范围。在您的情况下,这可能基于endTime-假设在创建记录时知道它并且它不会更改。

您将endTime在每个分区中存储一天的价值。然后,删除步骤将是截断分区,而不是删除大表中的一堆行。分区截断将是一种更快的方法。


哇,那真是太有用了,而且似乎是一个完美的解决方案。是时候阅读分区了!谢谢!

尽管分区可能是一个不错的解决方案,但是要注意开销-它可能会大大降低查询速度。另外截断表也不是即时的。我会考虑pt-archiver。您可以使用尖峰解决问题,并保持表格像现在一样简单
akuzminsky 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.