我想知道您对在MySQL 5.6中组织我的时间序列数据的方式的看法: 我正在一个需要存储来自不同传感器的数据的项目中工作。需要说明的是,我们正在监控几个工业设施。每个都由PLC设备(或站)控制,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
表中的tbl_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
顺序,这对于获得快速插入比率是有益的。只要我知道。
答案 0 :(得分:0)
我建议看看三件事:
vzcompress
工具,用于处理时间序列数据)。 答案 1 :(得分:0)
我没有解决任何SQL问题,但我正在回答“改进的空间”问题。
我建议您根据自己的要求手动压缩数据。虽然提到的RRD适用于固定大小的数据文件,但如果您希望将数据保留一段不确定的时间,或者使用SQL服务器的功能来存档数据,那就不好了。
我们所做的是使用max-delta算法,每个趋势(温度,电压等)都有自己的dv(值的变化)和存储在每个趋势的一些元数据中的dt(时间变化),例如如果measured dv < required dv
,则我们没有存储新样本,而measured dt < required dt
也是如此。
这给了我们很大的压缩和灵活性,因为你通常不会在温度读数上有太大的变化(设置dv = 0.5和dt = 30s);而你需要高分辨率的电压(设置dv = 0.01和dt = 0)等。
这种方法的缺点在于趋势和分析。由于我们为此编写了自己的工具,因此最难克服的是:
最终结果是,即使投票率很高,我们也可以记录一些存储量较小的趋势。