2010-07-31 50 views
2

我有了一个DEVICE_STATUS表看起来是这样的一个MySQL数据库的Web应用程序...战略来处理大型数据集的大量插入到表

deviceid | ... various status cols ... | created 

此表被插入多少次一天(每台设备每天2000+以上(估计到今年年底将有100多台设备))

基本上这个表在设备上发生任何事情时都会得到记录。

我的问题是我应该如何处理一个非常快速增长的表格?

  1. 我应该放松一下,希望数据库在几个月内可以正常工作,当这个表有超过1000万行?然后在一年有1亿行?这是最简单的,但看起来像一个表大,会有可怕的表现。

  2. 我应该在一段时间(一个月,一周)之后存档较早的数据,然后让Web应用程序为最近的报告查询实时表格,并查询实时表格和存档表格以获取涵盖更大时间跨度的报告。

  3. 我应该有一个每小时和/或每日聚合表格来总结设备的各种状态吗?如果我这样做,触发聚合的最佳方法是什么?克龙?数据库触发器?另外我可能还需要归档。

必须有一个更优雅的解决方案来处理这种类型的数据。

+0

随着时间的推移,有多少数据对您有价值?你需要所有的东西吗?监控数天和更长时间使用的空间 - 是否一致,以及可用空间耗尽多长时间? – 2010-07-31 03:50:45

+0

旧数据不是非常有价值,但应用程序将需要每个设备的总数,以适用于设备使用期限内的每种状态组合。但就报告某个特定设备每小时甚至每天“多少次”应多于足够的粒度而言多少次。 “直到可用空间用完”是什么意思? – delux247 2010-07-31 04:12:01

+0

数据库中的数据占用硬盘驱动器上的空间。随着越来越多的文件被写入,并且没有任何文件被存档到硬盘驱动器中 - 最终,您将会耗尽空间。 – 2010-07-31 05:44:57

回答

1

我在跟踪我网站上广告客户的浏览次数方面遇到类似问题。最初,我为每个视图插入一个新行,正如你在这里预测的那样,这很快导致表的增长过于庞大(直到它确实导致性能问题,最终导致我的托管公司关闭该站点几个小时,直到我解决了这个问题)。

我使用的解决方案与您的#3解决方案类似。在发生新视图时,我不会插入新记录,而是更新相关时间段内的现有记录。就我而言,我为每个广告每日记录一次。什么时间使用您的应用程序将完全取决于您的数据的具体细节和您的需求。

除非您需要在过去一小时内专门跟踪每个事件,否则您可能会过度使用它来存储它们并稍后进行聚合。您可以简单地检查具有匹配规格的条目,而不是使用cron作业执行常规聚合。如果找到一个,则更新匹配行的计数字段而不是插入新行。

+0

感谢您的回答,我想知道...你做了很多更新后,你的表现如何。我知道通常插入要快得多。 – delux247 2010-07-31 19:24:42

+0

迄今为止表现一直不错。现在只有一周左右的时间。 – 2010-07-31 23:18:04