在数据库中存储大量数据

时间:2011-07-20 10:23:22

标签: database postgresql home-automation

我目前正致力于家庭自动化项目,该项目为用户提供了在一段时间内查看其能源使用情况的可能性。目前我们每15分钟请求一次数据,我们预计我们的第一个大型飞行员将有大约2000名用户。

我的老板要求我们存储至少半年的数据。快速总和可以估计大约3500万条记录。虽然这些记录很小(每个大约500字节),但我仍然想知道将它们存储在我们的数据库(Postgres)中是否是一个正确的决定。

有没有人有一些很好的参考资料和/或建议如何处理这些信息?

6 个答案:

答案 0 :(得分:4)

我们经常点击看起来像这样的表格。显然,根据用法构建索引(你读或写了很多,等等),并从一开始就考虑基于数据的高级分组的表分区。

此外,您可以实施归档构思以保持实时表的精简。在我看来,历史记录要么从未被触及,要么被报告,这两种对于生活表都没有好处。

值得注意的是,我们有大约100万条记录表,我们并不认为存在性能问题。很多这些性能改进可以在之后轻微的痛苦,所以你总是可以从常识解决方案开始,只有在性能被证明是差的时才进行调整。

答案 1 :(得分:4)

目前,每个0.5K的35M记录意味着37.5G的数据。这适合您的飞行员的数据库,但您也应该考虑飞行员之后的下一步。当飞行员取得巨大成功时,你的老板不会高兴,而且你会告诉他在接下来的几个月里你不能在系统中添加100.000用户而不重新设计所有东西。此外,VIP用户在每分钟请求数据的新功能如何......

这是一个复杂的问题,您所做的选择将限制软件的发展。

对于飞行员,尽量保持尽可能便宜的产品 - >好的数据库。但是告诉老板你不能打开这样的服务,并且你必须在每周获得10,000个新用户之前改变一些东西。

下一个版本有一件事:拥有许多数据存储库:一个用于经常更新的用户数据,一个用于查询/统计系统,...

您可以查看RRD以获取下一个版本。

另请注意更新频率:2000个用户每15分钟更新一次数据意味着每秒更新2.2次 - >好; 100.000用户每5分钟更新一次数据意味着每秒333.3次更新。我不确定一个简单的数据库可以跟上它,而单个Web服务服务器肯定不能。

答案 2 :(得分:1)

首先,我建议您进行性能测试 - 编写一个程序,生成与半年内看到的条目数相对应的测试条目,插入它们并检查结果以查看查询时间很满意。如果没有,请尝试按其他答案的建议进行索引。顺便说一下,也值得尝试写入性能,以确保您可以在15分钟或更短的时间内在15分钟内插入您正在生成的数据量。

进行测试将避免所有问题的母亲 - 假设: - )

还要考虑生产性能 - 您的飞行员将拥有2000名用户 - 您的生产环境将在一两年内拥有4000名用户或20万用户?

如果我们谈论的是一个非常大的环境,您需要考虑一个解决方案,它允许您通过添加更多节点来扩展,而不是依赖于始终能够为单个计算机添加更多CPU,磁盘和内存。您可以在应用程序中执行此操作,方法是跟踪多个数据库计算机中哪些托管特定用户的详细信息,或者您可以使用Postgresql集群方法之一,或者您可以使用完全不同的路径 - {{3方法,你完全离开RDBMS并使用为水平扩展而构建的系统。

有很多这样的系统。我只有NoSQL的亲身经历。你必须认为与你习惯的RDBMS世界完全不同,这是一个挑战 - 想想你想要的更多 访问数据而不是如何存储它。对于您的示例,我认为使用user-id作为键存储数据,然后添加列名称为时间戳的列,列值作为该时间戳的数据将是有意义的。然后,您可以要求对这些列进行切片,例如在Web UI中绘制结果 - Cassandra具有足够好的UI应用程序响应时间。

在学习和使用nosql系统方面投入时间的好处是,当您需要更多空间时 - 您只需添加一个新节点。如果您需要更高的写入性能或更高的读取性能,也一样。

答案 3 :(得分:0)

使用适当的索引来避免慢查询,我不希望任何体面的RDBMS与这种数据集斗争。很多人使用PostgreSQL处理的数据远不止这些。

这是为数据库制作的:)

答案 4 :(得分:0)

最好不要在整个期间保留个别样品吗?您可以实现某种合并机制,将每周/每月样本连接到一个记录中。按计划进行合并。

您的决定必须依赖于您需要能够在数据库上运行的查询类型。

答案 5 :(得分:0)

有很多技术可以解决这个问题。如果您触摸最小记录数,您将只获得表现。在您的情况下,您可以使用以下技术。

  1. 尝试将旧数据保存在单独的表中,您可以使用表分区,也可以使用不同的方法将旧数据存储在文件系统中,可以直接从应用程序中提供,而无需连接到数据库,这样你的数据库是免费的。我正在为我的一个项目做这个,它已经有超过50GB的数据,但它运行得非常顺利。
  2. 尝试索引表格列,但要小心,因为它会影响您的插入速度。
  3. 尝试批量处理您的插入或选择查询。你可以在这里非常巧妙地处理这个问题。 示例:假设您每1秒钟后收到在任何表中插入记录的请求,那么您建立了一个机制,您可以在这种情况下以5个记录的方式处理此请求,这样您将在5秒后点击数据库,这样会好得多。是的,您可以让用户等待5秒钟等待他们的记录插入,例如在您发送电子邮件的Gmail中,它会要求您等待/处理。对于select,你可以定期将结果集放在文件系统中,并且可以直接向用户提供,而不像大多数股票市场数据公司那样触及数据库。
  4. 你也可以使用一些像Hibernate这样的ORM。他们将使用一些缓存技术来提高数据的速度。
  5. 如有任何进一步的查询,您可以发送邮件至ranjeet1985@gmail.com