需要数据库设计建议

时间:2010-05-27 08:44:23

标签: sql mysql caching memcached

我是一家电信公司的独立开发人员,我正在接受任何有时间回答的人的数据库设计建议。

我每天插入一个表~2百万行,然后这些表每月进行存档和压缩。每个月表包含~15,000,000行。虽然这个月逐月增加。

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

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

所以我想在完成上述所有问题后我的问题很简单。我应该编写一个脚本,将相关表中的数据分组到较小的表中。或者我应该将查询结果集存储在memcache之类的内容中?我已经在使用mysqls缓存,但由于对数据存储时间的控制有限,因此它无法正常工作。

我可以看到使用memcache这样的主要优点:

  • 查询兑现后,我的关联表上没有阻塞。
  • 在后端收集器之间共享收集的数据的灵活性更高 和前端处理器。 (即自定义报告可以写在 后端和这些结果存储在缓存下的一个键中 然后与想要查看此报告数据的任何人分享)
  • 如果我们开始与大量客户共享此数据,那么冗余和可扩展性。

我可以看到使用memcache这样的主要缺点:

  • 如果重新启动计算机/刷新缓存,则数据不会持久。

使用MySql的主要优点

  • 持久数据。
  • 更少的代码更改(尽管添加 像memcache这样的东西是微不足道的 反正)

使用MySql的主要缺点

  • 每次要存储时都必须定义表模板,提供一组新的分组数据。
  • 必须编写一个循环相关数据并填充这些新表的程序。
  • 随着数据的不断增加,潜在的增长速度仍会缓慢。

抱歉相当长的问题。无论如何,这有助于我写下这些想法,并且非常感谢处理这类问题的任何建议/帮助/经验。

非常感谢。

艾伦

4 个答案:

答案 0 :(得分:2)

除了您上面讨论的选项之外,您可能还需要考虑在图片中添加更强大的硬件,如果这是一个选项。

你的问题的这一点表明,这里的根本问题是结果的速度:

  

然而我的公司现在希望   对这些数据执行一些统计,   而这些表格变得太大了   以什么方式提供结果   被视为合理的时间。

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

只是一个想法!

答案 1 :(得分:1)

(我的另一个答案,不同,我会单独发布)

两个问题:

贵公司想要产生什么样的统计数据? 和
将行插入数据库后,它们是否曾被更改过?

如果插入后数据没有改变,那么你可以建立一个单独的'stats'表,你可以在插入新行时修改/更新,也可以在插入新行后不久。

e.g。比如:

  • 当插入与统计'B'相关的新行时,请在另一个表中增加一个数字,用于统计'B',分钟'Y'左右 或
  • 每小时对上一小时插入的行运行一个小查询,生成该小时的统计信息并单独存储。 或
  • 如上所述,但每分钟等。

如果不了解细节,很难更具体,但根据您所追求的统计数据,这些方法可能有所帮助。

答案 2 :(得分:1)

如果您想在几天前对静态数据进行一些分析,您应该考虑使用类似OLAP系统的东西。

基本上,这种类型的系统库存中间统计数据的格式为快速sum(),avg(),count()...在大表上。

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

看看。

答案 3 :(得分:1)

我在一家情况相似的公司工作,每月有数百万的插页。

我们采用了在较小的表格中汇总数据的策略,按特定字段分组。

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

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