背景
我有一个大约2000个传感器的网络,每个传感器都有大约100个数据点,我们每隔10分钟收集一次。这些数据点通常是int值,但有些是字符串和浮点数。此数据应存储90天,如果可能的话,还可以保留更长时间。
数据库设计
当最初负责该项目时,我编写了一个C#应用程序,该程序为每个传感器编写了逗号分隔的文件。当时没有那么多,当有人想查看趋势时,我们将在Excel中打开csv并根据需要绘制图形。
事情发展了,我们切换到了MySQL数据库。我为每个传感器创建了一个表格(是的,我知道很多表格!);它一直运行良好,但是有一些局限性。拥有如此多的表,显然不可能编写查询来查找特定值时在所有传感器中查找数据的查询。
对于下一个版本,我切换到Microsoft SQL Server Express,并将所有传感器数据放入一个大表中。这也有效,并且让我们进行查询以在所有感兴趣的传感器中查找值。但是,我遇到了Express版本的10GB限制,因此决定改回MySQL,而不是投资于SQL Server Standard。
问题
我对MySQL的性能和可伸缩性感到满意,但不确定是否坚持采用“一个表中的所有数据”方法是最好的。一张桌子上的10GB似乎要求使用其他设计。我应该提到仍然需要查询图形数据,而且我担心查询图形时会出现性能问题,例如,整个90天中一个传感器的温度数据。(换句话说,图形应该是可以快速生成的图形,而不必等待SQL对大量数据进行排序以隔离感兴趣的传感器。)
是否应该以某种方式拆分此表以提高性能?拥有这么大的桌子不是很平常吗?
我在Sensor ID和Timestamp列上都有索引,这几乎是任何查询的定义边界。(即从时间A到时间B获取传感器X的数据)。
我已经阅读了一些有关分片和分区的知识,但是在这种情况下,觉得不合适。
编辑:
根据到目前为止的评论和答案,一些其他信息可能会有所帮助:
不定期存储:目前,我不存储90天以上的数据。每天,我都会运行一个查询,以删除90天以上的数据。如果将来它变得很重要,我会存储更多,但现在就足够了。这有助于保持大小和性能更高。
引擎类型:原始的MySQL实现使用MyISAM。这次为新实现创建表时(一个数据表而不是多个数据表),它们默认为InnoDB。我不认为我需要其中之一。
标准化:当然,除了数据收集表外,还有其他表。这些支持表存储诸如传感器的网络信息,用户的登录信息等内容。据我所知,没有太多要标准化的东西。数据表具有如此多列的原因是每个传感器都有很多变量。(多个温度,光照水平,气压等)。对我进行归一化意味着没有冗余数据或重复的组。(至少对于1NF。)对于给定的传感器,在特定时间存储所有值需要一行数据,并且其中不涉及1:N关系(我知道)。
我可以在功能上分解表,例如在一个表中创建所有与温度相关的值,在另一个表中创建与气压相关的所有值。虽然这可能会提高仅进行温度查询的人员的效率,但我仍然必须一次插入所有数据。尽管如此,效率提高对于SELECT操作还是值得的。显然,最好根据用户请求数据的频率垂直拆分表。也许这就是我应该做的。我想在问我一个问题时正在寻求确认,这样做是值得的。
编辑2:
数据使用:最终,绝不会查看或需要很多数据,因为我们通常只关注有问题的项目。但是,在尝试发现问题时,我们使用各种工具来搜索数据并确定要放大的项目。
例如,我们注意到内存使用率值(特定于客户的专有软件程序)与重启/崩溃之间的相关性。我收集的数据点之一与此内存使用情况有关,并且我能够查看历史数据以显示超出特定内存使用量后设备变得不稳定。今天,对于运行该软件的部分设备,我检查了该值,如果该值过高,则发出重新启动命令。在发现这一点之前,我认为收集这些数据没有价值。
因此,我坚持要收集并存储大约100个数据点,即使该值值得怀疑。但是在正常的日常使用中,用户通常会检查其中的十几个参数。如果用户对特定地理区域感兴趣,则他(可以使用软件)可能会为几十个传感器生成数据的图形或电子表格。查看30天的图表并显示两条或三条显示温度,气压和光照水平等曲线的情况并不少见。这样做将运行类似于以下的查询:
SELECT sensor_id, location, data_timestamp, temp1, air1, light1
FROM data
WHERE data_timestamp >= '2012-02-01'
AND sensor_id IN (1, 2, 3);
(在原始的MySQL版本中,每个传感器都有自己的表,将发出三个单独的查询,但结果将通过软件合并以创建图形。)
由于该data
表包含很多行(〜1000万),尽管在id
和上都有索引data_timestamp
,所以性能明显比多表方案(9秒内返回4500行,而在此示例中不到1秒)要好。在多表模式中,找到哪些传感器满足特定条件的能力实际上为零,因此,移至单个表的原因。
这类查询可以由多个用户快速连续地完成,因为他们选择了不同的数据组并比较每个结果中的图形。每个图形或电子表格等待近10秒可能会令人沮丧。
90天后数据将被丢弃。可以将其存档,但当前不是必需的。
希望这些信息有助于更充分地显示收集和存储数据后的使用方式。