测试时间戳是否在范围内的最佳方法

时间:2016-09-05 13:45:00

标签: mysql performance time-series data-analysis bigdata

我想知道,考虑到数据存储量增长,如果时间戳介于日期之间,那么最有效的测试方法是什么。

设置

基本上我必须要表。一个(A)表示密度为每分钟的传感器数据,一个(B)表,其中只监控变化。

A 是每分钟存储所有传感器数据并且不断增长的表。要求数据以此密度存储,不能压缩。

+-----------+------------------------+-------+
| sensor_id |        datetime        | value |
+-----------+------------------------+-------+
|         1 |    2016-08-22 17:26:00 |    23 |
|         1 |    2016-08-22 17:27:00 |     5 |
|         1 |    2016-08-22 17:28:00 |    12 |
|         1 |    2016-08-22 17:29:00 |     0 |
|         1 |    2016-08-22 17:30:00 |   150 |
|         1 |    2016-08-22 17:31:00 |     9 |
+-----------+------------------------+-------+

B 是监控传感器所有状态变化的表。这些事件可以随机发生,而不是每分钟发生。

+-----------+------------------------+----------+
| sensor_id |        datetime        |  state   |
+-----------+------------------------+----------+
|         1 |    2016-08-22 17:26:00 | up       |
|         1 |    2016-08-22 17:29:00 | down     |
|         1 |    2016-08-22 17:31:00 | shutdown |
+-----------+------------------------+----------+

结果

现在我想为表A中的每个数据映射表B中的相应状态,看起来像

+-----------+------------------------+-------+----------+
| sensor_id |        datetime        | value |  state   |
+-----------+------------------------+-------+----------+
|         1 |    2016-08-22 17:26:00 |    23 | up       |
|         1 |    2016-08-22 17:27:00 |     5 | up       |
|         1 |    2016-08-22 17:28:00 |    12 | up       |
|         1 |    2016-08-22 17:29:00 |     0 | down     |
|         1 |    2016-08-22 17:30:00 |   150 | down     |
|         1 |    2016-08-22 17:31:00 |     9 | shutdown |
+-----------+------------------------+-------+----------+

问题

由于有多个传感器,两个表中的数据都在不断增长。例如,将所有值保留一个月且一个传感器将导致 43200 数据点。增加传感器的数量也会增加两个表中的数据点数量,从而使映射变得越来越慢。

那么最好的方法是检查表A中的时间戳是否在我的商店成长到数百万个数据点时表B之间的状态之间?我必须从A中获取每个单点并从表B中查找匹配状态,这也可能有数百万个数据点,我的猜测是这变得非常缓慢且效率低下。我需要实时进行分析!

Thx

1 个答案:

答案 0 :(得分:0)

那么,根据当前的数据集,以下似乎是有效的 - 虽然我想知道你是否过度简化了问题,以及我是否已经过度解决了这个问题。

SELECT x.*
     , y.state -- or possibly COALESCE(y.state,'up') state
  FROM
     ( SELECT a.*
            , MAX(b.datetime) max_datetime
         FROM table_a a 
         LEFT 
         JOIN table_b b 
           ON b.sensor_id = a.sensor_id 
          AND b.datetime <= a.datetime 
        GROUP 
           BY a.sensor_id,a.datetime
     ) x
  LEFT
  JOIN table_b y
    ON y.sensor_id = x.sensor_id
   AND y.datetime = x.max_datetime;