如何根据时间戳耦合同一张表中的数据点?

Posted

技术标签:

【中文标题】如何根据时间戳耦合同一张表中的数据点?【英文标题】:How to couple datapoints in the same table based on timestamps? 【发布时间】:2019-10-01 12:23:35 【问题描述】:

我有一个大的 mysql 表,其中包含各种数据的值(所有数据都具有不同的 data_id)和时间戳(以毫秒为单位的 unix 时间戳)。我试图为所有这些数据构建一个(实时)绘图仪,并且我希望能够将垂直轴上的任何数据与水平轴上的任何其他数据进行对比。我遇到的问题是如何根据时间戳有效地耦合数据点。

数据集非常大,记录频率约为 10 Hz,我希望每 1-5 分钟有一个数据点。我已经设法进行了(有点)高效的 SQL 调用,以获得每 1 分钟的平均值和平均时间戳:

SELECT AVG(value), AVG(timestamp)
  FROM 
      (
        (
          SELECT value, timestamp
            FROM database 
           WHERE 
                 data_id = 100 AND
                 timestamp < ... and timestamp > ... 
        ORDER BY timestamp DESC
        ) as data
      )
GROUP BY timestamp DIV 60000
ORDER BY timestamp DESC;

但是,现在我希望能够绘制例如 data_id 100 与 data_id 200 的对比,而不是 data_id 100 与时间的对比。那么,对于大型数据集,如何在大约 1 分钟的时间步长内将 data_id 100 和 200 的值结合起来呢?

我已经尝试了以下方法,但是 SQL 调用花费的时间太长了...

SELECT a.timestamp, a.value, b.value 
  FROM 
      (
        SELECT value, timestamp 
          FROM daq_test.data_f32 
         WHERE
               data_id = 166 AND 
               timestamp < 1507720000000 AND
               timestamp > 1507334400000 
      ORDER BY timestamp DESC
      ) a,
      (
        SELECT value, timestamp 
          FROM daq_test.data_f32 
         WHERE
               data_id = 137 AND
               timestamp < 1507720000000 AND
               timestamp > 1507334400000 
      ORDER BY timestamp DESC
      ) b
WHERE a.timestamp DIV 60000 = b.timestamp DIV 60000
ORDER BY a.timestamp DESC;

【问题讨论】:

【参考方案1】:

我不知道这个查询有什么意义。但我的建议是根据 WHERE 子句中的参数创建一个索引。

因此,如果您要搜索具有 data_id 和时间戳的记录,最好基于这两列创建复合索引。

此外,最显着的减速可能是由 ORDER BY 时间戳引起的。 你能做 EXPLAIN SELECT 并编辑你的问题,这样我就可以用更正确的编辑来更新答案。

【讨论】:

以上是关于如何根据时间戳耦合同一张表中的数据点?的主要内容,如果未能解决你的问题,请参考以下文章

根据 postgresQL 中的时间戳将值从一个表映射到另一个表

hive-cli 和 presto-cli 中同一张表的时间戳不同

在 Laravel 中发生 Logout 事件时发布时间戳数据

如何根据当前时间戳计算每天0点0分0秒的unix时间戳?

根据 HIVE 表中的时间戳确定每个唯一值的采样间隔

如何根据同一张表中的其他列匹配替换空值