2010-05-27 232 views
7

我是一家电信公司的独立开发人员,并且在一些有时间回答的人的数据库设计建议之后。所需的数据库设计建议

我每天插入一张~2百万行的表格中,这些表格随后会按月存档和压缩。每个月表包含约15,000,000行。虽然这是逐月增加。

对于上面做的每一个插入操作,我将来自属于一起的行的数据组合起来,并创建另一个“相关”表。此表格目前尚未归档,因为我需要确保不会错过关联表格的更新。 (希望是有道理的)尽管一般来说这些信息在处理几天之后应该保持相当的静态。

以上所有内容均完美运行。然而,我的公司现在希望对这些数据执行一些统计数据,而这些数据表太大而无法在合理的时间内提供结果。即使设置了适当的索引。

所以我想以上所有我的问题很简单。我应该编写一个脚本,将来自相关表的数据分组为较小的表。还是应该将查询结果集存储在类似于memcache的东西中?我已经在使用mysqls缓存,但是由于对数据存储时间的控制有限,所以它不能很好地工作。

主要优点我可以看到使用类似的memcache的:

  • 没有阻止我的相关表的查询已兑现之后。
  • 在后端收集器 和前端处理器之间共享收集的数据具有更大的灵活性。 (也就是说,自定义报告可以写入 后端,并将这些结果存储在高速缓存中,然后 与任何想查看此报告数据的人共享)
  • 如果我们启动了冗余和可伸缩性与大量客户分享这些数据。

主要缺点,我可以看到使用类似的memcache的:如果机器重新启动/刷新缓存

  • 数据不具有持续性。

使用MySQL

  • 持久数据的主要优点。
  • 更少的代码变化(尽管加 类似的memcache是​​微不足道的 反正)

使用MySQL

  • 的主要缺点有我想要存储提供了一个新的每次定义表模板一组分组数据。
  • 必须编写一个循环遍历相关数据并填充这些新表的程序。
  • 随着数据的不断填充,潜在的增长速度可能会更慢。

道歉了相当长的问题。无论如何,这帮助我在这里写下这些想法,任何有关处理这类问题的建议/帮助/经验都将不胜感激。

非常感谢。

艾伦

+5

欢迎来到StackOverflow。长期的问题通常是很好的,因为它们往往表现出一些重要的事情,1)你实际上关心的是得到一个好的答案,而不是'给我编码'2)他们倾向于拥有所有(或者至少大部分)的信息需要准确回答这个问题,毕竟垃圾在==垃圾出来。 – UnkwnTech 2010-05-27 08:48:56

回答

2
从您上面讨论的选项

除此之外,您可能还需要考虑增加更强大的硬件到图片,如果那是一个选项。

你的问题的该位表明,潜在的问题在这里是结果的速度:

但我公司现在希望 执行一些统计数据对这一数据, 和这些表变得太大 到提供 被认为是合理时间的结果。

在结果速度很重要的情况下,在问题中抛出更好的/额外的硬件通常比开发新的代码/数据库结构/等更便宜。

只是一个念头!

+0

阅读完这个问题后,我的第一个想法是'Morez hardz',但看起来我被殴打了。 – 2010-05-27 09:21:43

+0

谢谢,不过,我猜测我的瓶颈现在纯粹是在从硬盘中提取数据的I/O上?即使通过另一台机器/多个驱动器进入等式,我也不确定我会使用什么解决方案? 我猜想当然有SSD硬盘? – 2010-05-27 09:24:27

+0

如果MySql在内存中缓存数据块,那么I/O不一定是瓶颈。也许做一些监测,以确定它是否是。 – codeulike 2010-05-27 09:33:46

1

(从我的另一个答案,够不同,我会单独张贴)

两个问题:

贵公司想什么样的统计数据的产生?

将行插入数据库之后,它们是否改变过?

如果数据不插入后更改,那么你可以建立一个独立的“统计信息”表中,你修改/更新作为新行插入,也可能很快插入新行之后。

例如之类的东西:

  • 当一个新的行插入这就是有关STAT“B”,去增加一些在另一个表统计“B”,分“Y”
  • 每隔一小时,运行已插入在过去一小时行一个小的查询,生成相应小时的统计信息,并将其存储分别
  • 如以上,但每分钟等

它很难再特别说一下不知道细节,但根据你的统计数据,这些方法可能会有所帮助。

+0

统计数据是基本的,例如按目的地分组。按目的地分组,按客户分组统计。所有信息都在一个关联表中。这意味着我必须等到我有完整的相关数据。 有了上述三种解决方案,您最喜欢什么?显然,为每个插入操作插入和更新会降低我可以完成一个完整记录插入的速度。 – 2010-05-27 14:07:25

+0

如果您可以在发生每次插入时更新统计信息(下面也是用户提出的建议),那么这在概念上会更简单,但正如您所说的那样,会使更新速度变慢。而且它增加了插入代码中错误的可能性,这是你不想要的。一个单独的进程每隔n分钟为近期插入生成统计信息会更安全,并且(理论上)不会减慢插入。但是编码稍微困难。 – codeulike 2010-05-27 15:56:01

1

如果你想要做的,从几天就回来静态数据的一些分析,你或许应该考虑使用像一个OLAP系统。

基本上,在他们的格式这种类型的系统股票中间统计做快速求和(),AVG(),COUNT()...大表。

我认为你的问题是使用它的情况的一个完美例子,但也许我认为只是因为这是我的工作。 =)

看一看。

+0

非常感谢,我现在看看OLAP – 2010-05-27 14:07:41

1

我在一家类似情况的公司工作,每月插入数百万条插件。

我们采用了总结小表中数据的策略,按照某些字段进行分组。

在我们的例子中,当执行插入操作时,它会触发一个函数,该函数对插入的元组进行分类并递增汇总表。

我们不时将最旧的行移动到备份表中,减少了主表的增长。

+0

看起来这是前进的道路!感谢您的回复。 – 2010-05-27 14:08:06