【问题标题】:database design - MySQL: How to store and split time series数据库设计 - MySQL:如何存储和拆分时间序列
【发布时间】:2019-01-10 04:19:39
【问题描述】:

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

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

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

【问题讨论】:

  • 看看像influxdb这样的时间序列数据库
  • @fancyPants 我目前正在使用 aws RDS
  • 您每 1 小时存储一次平均值的想法(可能是 1 小时表中的每一天)似乎是合理的,您可能可以使用 triggers 来实现这一点(并从5分钟表)。
  • @Nick 谢谢,如果我停止跟踪某些项目(我从未使用过触发器),为插入的行设置触发器会导致错误吗?即使超过 24 小时过去了,旧条目之类的东西仍然存在。
  • 是的,旧条目将保留,但应该可以围绕它编写代码。或者也许设置一个 cron 作业来清理旧条目。此外,如果您停止跟踪某个项目,那么您就不再担心桌子变大了...

标签: mysql database database-design time-series


【解决方案1】:

你在正确的轨道上。

有多个问题需要决定如何处理——缺少条目、时间戳偏差 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

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2012-01-11
    • 2012-09-02
    • 2011-09-27
    相关资源
    最近更新 更多