我想知道您对在 MySQL 5.6 中组织时间序列数据的方式的看法:我正在从事一个需要存储来自不同传感器的数据的项目。需要明确的是,我们正在监控几个工业设施。每一个都由一个 PLC 设备(或站)控制,该设备在本地存储与过程最相关的信息。每个传感器都映射到 plc 中的标签中,plc 会定期将此信息以 CSV 格式发送到 FTP 服务器。我们选择了 innoDB 作为我们的存储引擎,并且有以下表格:
tbl_stations (id,name)
tbl_tags (station_id, tag_id, name ... ) with (station_id, name) being the PK
tbl_data (station_id, tag_id, time, value) with PK (stations_id, tag_id, time)
PK
intbl_data
表是为了允许表单的快速范围查询
SELECT * FROM tbl_data WHERE station=x and tag_id=y and time BETWEEN date1 AND date2
此外,由于某些标签的采样速度非常快,因此表格tbl_data
增长得非常快。为了更好地管理它,并且因为我们通常访问的是最新信息,我们按列tbl_data
上的范围"time"
(即时间戳)进行分区。特别是,我们每年使用 4 个分区。即使启用了分区,单个分区也会随着站点数量的增加而增长很多。所以我们决定按 station_id 进行子分区,这样每个子分区将只包含几个站点的数据。特别是,我们为此目的使用了 HASH 分区。
目前,一切运行良好,但我只是想听听您的意见,以防万一还有改进的空间。这是我对时间序列数据的第一次体验……所以可能是我遗漏了一些重要的东西。
我忘了提到我们以以下格式从每个站接收数据:
TAG_ID1
TIME, VALUE
TIME, VALUE
.
.
TAG_ID2
TIME, VALUE
TIME, VALUE
.
.
.
等等。这样,插入以某种方式PK
有序,据我所知,这有利于获得快速的插入率。