我是一家电信公司的独立开发人员,我正在接受任何有时间回答的人的数据库设计建议。
我每天插入一个表~2百万行,然后这些表每月进行存档和压缩。每个月表包含~15,000,000行。虽然这个月逐月增加。
对于我在上面进行的每个插入,我将来自属于一起的行的数据组合并创建另一个“相关”表。此表目前尚未归档,因为我需要确保永远不会错过相关表的更新。 (希望这是有道理的)虽然一般来说,这些信息在处理完几天后应该保持相当静态。
以上所有方法都很完美。然而,我的公司现在希望针对这些数据执行一些统计数据,并且这些表格变得太大而无法在合理的时间内提供结果。即使设置了适当的索引。
所以我想在完成上述所有问题后我的问题很简单。我应该编写一个脚本,将相关表中的数据分组到较小的表中。或者我应该将查询结果集存储在memcache之类的内容中?我已经在使用mysqls缓存,但由于对数据存储时间的控制有限,因此它无法正常工作。
我可以看到使用memcache这样的主要优点:
我可以看到使用memcache这样的主要缺点:
使用MySql的主要优点
使用MySql的主要缺点
抱歉相当长的问题。无论如何,这有助于我写下这些想法,并且非常感谢处理这类问题的任何建议/帮助/经验。
非常感谢。
艾伦
答案 0 :(得分:2)
除了您上面讨论的选项之外,您可能还需要考虑在图片中添加更强大的硬件,如果这是一个选项。
你的问题的这一点表明,这里的根本问题是结果的速度:
然而我的公司现在希望 对这些数据执行一些统计, 而这些表格变得太大了 以什么方式提供结果 被视为合理的时间。
在结果速度很重要的情况下,在问题上抛出更好/更多的硬件往往比开发新的代码/数据库结构/等更便宜。
只是一个想法!
答案 1 :(得分:1)
(我的另一个答案,不同,我会单独发布)
两个问题:
贵公司想要产生什么样的统计数据?
和
将行插入数据库后,它们是否曾被更改过?
如果插入后数据没有改变,那么你可以建立一个单独的'stats'表,你可以在插入新行时修改/更新,也可以在插入新行后不久。
e.g。比如:
如果不了解细节,很难更具体,但根据您所追求的统计数据,这些方法可能有所帮助。
答案 2 :(得分:1)
如果您想在几天前对静态数据进行一些分析,您应该考虑使用类似OLAP系统的东西。
基本上,这种类型的系统库存中间统计数据的格式为快速sum(),avg(),count()...在大表上。
我认为你的问题是使用它的情况的完美例子,但也许我认为这只是因为这是我的工作。 =)
看看。
答案 3 :(得分:1)
我在一家情况相似的公司工作,每月有数百万的插页。
我们采用了在较小的表格中汇总数据的策略,按特定字段分组。
在我们的例子中,当执行插入时,它会触发一个函数,该函数对插入的元组进行分类并递增汇总表。
我们会不时将最旧的行移动到备份表,从而减少主表的增长。