MySQL分区,从多个相关表中删除旧数据

时间:2012-09-23 10:55:59

标签: mysql myisam

我是MySQL分区的新手,因此任何一个例子都会受到赞赏。

我正在尝试为在几个MyISAM表之间分配的数据创建一种老化机制。

我的问题实际上包括几个子问题。

相关表格是:

  1. 第一个表包含具有高输入频率的原始数据(每个记录旁边都有一个自动递增的ID)。
  2. 第二个表包含已处理的结果,每个原始数据记录都有一个结果记录(结果记录包含原始数据记录的自动增量字段的源ID记录)
  3. 问题:

    1. 我需要能够对原始数据表和结果数据表进行类似的分区,以便它们在单个分区中只包含10周的数据(每个原始数据记录包含unixtimestamp字段),我该怎么做,有人可以为两个这样的表写小例子吗?。
    2. 我希望能够动态更改10周的约束。
    3. 我希望当填充当前分区或创建新分区时,前一个(前10周)分区将自动删除。
    4. 我不希望自动增量id整数溢出,因为我理解id只对于分区是唯一的,所以如果我没有错,自动增量id将从零开始为下一个分区?但是,如果以前的分区仍然存在,我将有2个重复的ID,当我提供结果记录时,我怎么知道只引用最后一个id?
    5. 我想使用LOAD DATA INTO加载原始数据...而不是多次插入,是否会影响MySQL分区功能?
    6. 最后一个问题,您是否建议采用其他方法来实现老化机制(我正在编写Java实现产品,每天处理大约1 GB或原始数据并将结果存储在MySQL中)

3 个答案:

答案 0 :(得分:1)

LOAD DATA非常快。我只有两个步骤(没有特定顺序) - LOAD DATA然后'delete .. where date< 10周'。自动增量将持续与您正在使用的数据类型一样长。如果你想要非常小心,你可以定期将它推回零。

数据进入“原始”表后,运行例程以创建“已处理”表。我在工作中使用v类似的过程。我们保留一个单独的表,其中包含指向所有“原始”表的“写”和“解析”指针。当新数据进入并被解析时,将设置适当的行指针。如果'raw'表被截断,你可以重置'write'指针但保留'parse'指针。 (当发生这种情况时,我们将偏移存储在另一个表中 - 只是为了确定)。

答案 1 :(得分:1)

很难对这个问题给出真正的答案,因为它取决于你的数据。但是,让我给你一些思考的东西。

  1. 我假设我们正在谈论某些带有最新数据的日志(因此不会跨越多年)。您可以按范围进行分区。您可以使用年/周编号(即201201,201202等)向表中添加一个字段。如果此问题与您关于导入多个表的问题有关,则可以轻松执行此操作,即导入脚本。

  2. 在运行中,即时重新分配您的数据(70GB?)。我不推荐它。但如果你有那个星期的数字,那么你可以做到。如果您以后想要将其更改为12天,则可以为该日期和分区添加一列。

  3. 那么它不会被自动删除,但是一个cron作业可以处理它吗?只需检查有多少分区,如果有3个(?)删除第一个分区。

  4. 分区需要在您分区的字段上具有主索引(如果要使用自动增量)。因此,您永远不能完全依赖自动增量ID。我没有看到解决方法。

  5. 我不确定你的意思。

  6. 如果您的数据只是按时间顺序排列的某些日志,那么您可能只是为每个时段使用单独的表。然后在开始新时段(00:00)之前,检查最后一个表的最后一个id,创建一个新表并将自动增量设置为该值+1。然后您的导入将决定何时开始新的期间,以便可以轻松更改。您的导入脚本可以使用一个小表来存储下一个句点。

答案 2 :(得分:0)

如果我建议,为每个相关列创建索引列也可以增强性能从多个相关表中删除旧数据,因为我们刚刚比较了索引号而不是字符串。

我想知道你的桌子是否正在分类。