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

10 mysql php

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

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

DELETE FROM table WHERE endTime < '1393632001'
Run Code Online (Sandbox Code Playgroud)

上次运行查询时,它检查了 4,602,400,花费了 3 多分钟,CPU 崩溃了。

CPU在午夜尖峰

在清除旧数据的同时,我们可以做些什么来防止 CPU、同步数据库连接、磁盘提示深度等不合理地飙升?

PS:您会注意到查询实际上发生在我们使用周期中相当不合时宜的时间。假设我们已经将查询的时间转移到每天使用的最低点。此外,“endTime”上没有索引,如果可能的话,我更愿意保持这种方式,因为有大量数据被非常定期地插入,并且没有太多查找。

Gor*_*off 13

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

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

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