我有一个表,用于存储历史数据,并每5分钟添加一次我要跟踪的项目的记录。
这是仅使用两个项目的示例:

+----+-------------+
| id |  timestamp  |
+----+-------------+
|  1 |  1533209426 |
|  2 |  1533209426 |
|  1 |  1533209726 |
|  2 |  1533209726 |
|  1 |  1533210026 |
|  2 |  1533210026 |
+----+-------------+


问题是我实际上正在跟踪4k项,并且表格不断变大,而且,如果我想获得上个月的数据,则不需要5分钟的数据。我想了解的是,是否可以保留过去24小时的5分钟记录,过去7天的1小时记录等。也许每小时我可以从5分钟表中获取前12条记录并存储平均值在1h表中?但是,如果由于错误而缺少某些记录怎么办?这是解决此问题的正确方法,还是有更好的选择?

最佳答案

您走在正确的轨道上。

有多个问题需要决定如何处理-缺少条目,时间戳偏移1秒(或其他时间)等。

通过提供一个计数(应始终为12),您可以发现一些问题:

SELECT  FLOOR(timestamp / 3600) AS hr,  -- MEDIUMINT UNSIGNED
        COUNT(*),    -- TINYINT UNSIGNED
        AVG(metric)  -- FLOAT
    FROM tbl
    GROUP BY 1;


是的,每小时都要处理前一小时的数据。添加WHERE timestamp BETWEEN ... AND ... + 3599以约束所讨论的范围。然后清除相同的数据集。

该表将具有PRIMARY KEY(hr)

除非您正在谈论表中的数百万行,否则我建议您不要使用PARTITION

关于mysql - 数据库设计-MySQL:如何存储和拆分时间序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51652857/

10-09 16:13
查看更多