1

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

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

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

相关表格如下:

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

问题:

  1. 我需要能够对原始数据表和结果数据表进行类似的分区,以便它们在单个分区中仅包含 10 周的数据(每个原始数据记录都包含 unixtimestamp 字段),我该怎么做,有人可以写两个这样的表的小例子?
  2. 我希望能够即时更改 10 周的限制。
  3. 我希望当当前分区被填充或创建新分区时,前一个(10 周前)分区将被自动删除。
  4. 我不希望自动递增 id 整数被溢出,据我所知,id 仅对分区是唯一的,所以如果我没记错的话,下一个分区的自动递增 id 将从零开始?但是如果前一个分区仍然存在,我会有 2 个重复的 id,我怎么知道在呈现结果记录时只引用最后一个 id?
  5. 我想使用 LOAD DATA INTO... 而不是多次插入来加载原始数据,MySQL 分区功能是否受到影响?

最后一个问题,您是否建议一些其他方法来实现老化机制(我正在编写 Java 实现产品,每天处理大约 1 GB 或原始数据并将结果存储在 MySQL 中)

4

3 回答 3

1

LOAD DATA 非常快。我只需两个步骤(不分先后) - 加载数据,然后“删除 .. where date < 10 周”。只要您使用的数据类型,自动增量就会继续。如果您想非常小心,可以定期将其推回零。

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

于 2012-09-25T18:10:12.200 回答
1

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

  1. 我假设我们正在谈论带有最近数据的某种日志(因此不跨越多年)。您可以按范围进行分区。您可以在表格中添加一个字段,其中包含年/周编号(即 201201、201202 等)。如果这个问题与您关于导入多个表的问题有关,您可以轻松地做到这一点,即导入脚本。

  2. 在运行中,动态重新分区您的数据(70GB?)。我不会推荐它。但如果你有星期数,你就可以做到。如果您以后想将其更改为 12 天,则可以为日期添加一列并按此进行分区。

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

  4. 分区需要在您分区的字段上有一个主索引(如果您想使用自动增量)。因此,您永远不能单独完全依赖自动增量 ID。我没有办法解决这个问题。

  5. 我不确定你是什么意思。

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

于 2012-09-28T20:17:59.050 回答
0

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

我想知道您的表格是否正在排序。

于 2012-09-29T01:34:05.110 回答