mysql - 最优时间序列表示

标签 mysql time-series partitioning plc

我想知道您对 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 顺序排列,据我所知,这有利于获得快速插入率。

最佳答案

我建议看三件事:

  1. 您需要高分辨率历史数据吗?如果没有,您应该研究聚合旧数据的 RRD 类型数据库或自行实现数据聚合(例如 volkszaehler.org 项目有一个 vzcompress 工具用于对时间序列数据执行此操作)。 .
  2. 您是否经常需要检索聚合的时间序列数据(例如每天的总和)?如果是,单独的聚合表可能会有所帮助,例如volkszaehler.org 项目正在实现。
  3. 选择性最高的索引可能是时间戳,而不是电台或标签。重建索引的顺序可能会有所返回,但我不确定并建议进行性能(=负载)测试。

关于mysql - 最优时间序列表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19453981/

相关文章:

mysql - 使用 MySQL 查询创建 WordPress 用户

php - codeigniter 3.0.1 中的数据库错误

mysql - 与查询没有分区的相同数据相比,如果我一次在 mysql 中查询多个分区,是否存在任何性能问题?

sql - 灵活的运行窗口,可对时间范围内的条目进行计数

oracle - 像Oracle中一样,Hadoop/Hive中是否有Range Type分区?

python - MRJob 相同的 key 被发送到不同的 reducer

mysql - 如何将 AWS EC2 上设置的 Airflow 正确连接到 RDS?

MySQL 表创建错误(语法对我来说很好)

android - 在 MPAndroidChart 中显示单个 x 的多个 y 值

r - 绘制 xts 对象 : 'x' must be a time-series object 时出错