我想知道您对 MySQL 5.6 中时间序列数据的组织方式的看法: 我正在从事一个需要存储来自不同传感器的数据的项目。需要明确的是,我们正在监控多个工业设施。每一个都由 PLC 设备(或站)控制,该设备在本地存储与过程最相关的信息。每个传感器都映射到 PLC 中的一个标签,PLC 定期将此信息以 CSV 格式发送到 FTP 服务器。我们选择innoDB作为我们的存储引擎,下表如下:
tbl_stations(id,名称)
tbl_tags (station_id, tag_id, name ...),其中 (station_id, name) 为 PK
tbl_data(station_id、tag_id、时间、值)与 PK(stations_id、tag_id、时间)
tbl_data
表中的 PK
是为了允许表单的快速范围查询
SELECT * FROM tbl_data WHERE station=x and tag_id=y and time BETWEEN date1 AND date2
此外,由于某些标签的采样速度非常快,因此表 tbl_data
增长得非常快。为了更好地管理它,并且因为我们通常访问最新的信息,我们按 “time”
列(这是一个时间戳)上的范围对 tbl_data 进行分区。特别是,我们每年使用 4 个分区。即使启用了分区,单个分区也会随着工作站数量的增加而大幅增长。因此我们决定按 station_id 进行子分区,这样每个子分区只包含几个站的数据。为此,我们特别使用了 HASH 分区。
目前,一切都运行良好,但我只是想听听您的意见,以防仍有改进的空间。这是我第一次接触时间序列数据……所以我可能遗漏了一些重要的东西。
我忘了提及,我们以以下格式接收来自每个站的数据:
TAG_ID1
TIME, VALUE
TIME, VALUE
.
.
TAG_ID2
TIME, VALUE
TIME, VALUE
.
.
.
等等。这样,插入就以某种方式按 PK
顺序排列,据我所知,这有利于获得快速插入率。
最佳答案
我建议看三件事:
- 您需要高分辨率历史数据吗?如果没有,您应该研究聚合旧数据的 RRD 类型数据库或自行实现数据聚合(例如 volkszaehler.org 项目有一个
vzcompress
工具用于对时间序列数据执行此操作)。 . - 您是否经常需要检索聚合的时间序列数据(例如每天的总和)?如果是,单独的聚合表可能会有所帮助,例如volkszaehler.org 项目正在实现。
- 选择性最高的索引可能是时间戳,而不是电台或标签。重建索引的顺序可能会有所返回,但我不确定并建议进行性能(=负载)测试。
关于mysql - 最优时间序列表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19453981/