我想知道,考虑到数据存储量增长,如果时间戳介于日期之间,那么最有效的测试方法是什么。
设置
基本上我必须要表。一个(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
答案 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;