mysql摆脱冗余值

时间:2015-01-08 22:16:36

标签: mysql sql

我正在创建一个数据库来存储我创建的监控系统中的数据。系统每分钟需要几次数据点(~4000),并将它们存储在我的数据库中。我需要能够根据时间戳下调样本。现在我打算使用一个包含三列的表:

结果:
 1. point_id
 2.时间戳
 3.价值

所以我想做的查询是:

SELECT point_id, 
       MAX(value) AS value 
FROM results 
WHERE timestamp BETWEEN date1 AND date2 
GROUP BY point_id;

我遇到的问题是这对于内存而言似乎效率极低。使用这种结构,每个时间戳必须记录4000次,这对我来说似乎有些过分。我想到的唯一减少数据库内存占用的解决方案需要我使用单独的表(据我理解这是超级糟糕的做法)或将数据存储在CSV文件中,这需要我编写自己的代码来搜索数据(根据我的理解,我要求我不要成为一个傻瓜...而且搜索速度可能要慢得多)。是否有我可以实现的数据库结构,并不要求我存储这么多重复的数据?

2 个答案:

答案 0 :(得分:1)

使用您的数据结构的数据库效率将低于自定义代码。你猜怎么着。这并不罕见。

首先,我认为你应该等到这实际上是一个性能问题。没有小数秒的timestamp需要4个字节(参见here)。因此,记录会有4 + 4 + 8 = 16字节(假设value的双浮点表示)。通过删除时间戳,您将获得12个字节 - 节省25%。我并不是说这不重要。我说其他考虑因素 - 例如让代码工作 - 可能更重要。

根据您的数据,差异在184 MB /天到138 Mbytes /天,或67 GB /年和50 GB。您知道,无论您如何存储时间戳,您都必须处理大量数据问题。

在数据中保留时间戳将允许您进行其他优化,特别是使用分区将每一天存储在单独的文件中。假设where条件与分区兼容,这对您的查询应该是一个很大的好处。 (了解分区here。)您可能还需要索引,尽管分区应该足以满足您的特定查询示例。

SQL的重点并不在于它是解决任何特定问题的最佳方式。相反,它为各种各样的问题提供了合理的解决方案,并且它提供了许多难以单独实现的不同功能。因此,合理解决方案的时间远远少于开发定制代码。

答案 1 :(得分:0)

  

使用这种结构,每个时间戳必须记录4000次,这对我来说似乎有些过分。

不是真的。日期值不是很大,每行存储相同的值是完全合理的。

  

...使用单独的表格(据我所知,这是超级糟糕的做法)

谁告诉过你!!!规范化数据(拆分成单独的,链接的数据结构)实际上是一种很好的做法 - 只要你不过度 - 并且SQL旨在很好地处理关系表。创建一个“时间”表并链接到另一个表中的数据完全没问题。它会使用更多的内存,但除非你在非常有限的内存环境中工作,否则这真的不应该关注你。