проектирование базы данных - MySQL: как хранить и разбивать временные ряды

0

У меня есть таблица, где храню исторические данные и добавляю запись для элементов, которые я отслеживаю каждые 5 минут. Это пример, используя только 2 элемента:

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

Проблема в том, что я на самом деле отслеживаю 4k элементов, и таблица продолжает увеличиваться, также мне не нужны 5-минутные данные, если я хочу получить последний месяц. Я пытаюсь понять, есть ли способ сохранить записи за 5 минут за последние 24 часа, 1 час записи за последние 7 дней и т.д. Может быть, каждый час я могу получить первые 12 записей из таблицы 5 минут и сохранить средний в 1-й таблице? Но что, если некоторые записи отсутствуют, потому что были ошибки? Это правильный способ решить эту проблему или есть несколько лучших альтернатив?

  • 0
    Взгляните на базы данных временных рядов, такие как influenxdb
  • 0
    @fancyPants Я в настоящее время использую AWS RDS
Показать ещё 4 комментария
Теги:
database
time-series
database-design

1 ответ

0
Лучший ответ

Ты на правильном пути.

Есть несколько вопросов, которые необходимо решить, как обрабатывать - пропущенные записи, временные метки, перекошенные на 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню