Как соединить точки данных в одной таблице на основе меток времени? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть большая таблица mySQL, которая содержит значения для всех видов данных (все с разными data_id) и метку времени (метка времени unix в мс). Я пытаюсь построить (в режиме реального времени) плоттер для всех этих данных, и я хочу иметь возможность построить любые данные на вертикальной оси против любых других данных на горизонтальной оси. Проблема, которую я предпочитаю, состоит в том, как эффективно связать точки данных на основе их временных отметок.

Набор данных достаточно велик, частота регистрации составляет около 10 Гц, и я хочу, чтобы данные назначались каждые 1-5 минут. Мне уже удалось сделать (своего рода) эффективный вызов SQL, чтобы получить среднее значение и среднюю временную отметку за каждую 1 минуту:

SELECT AVG(value), AVG(timestamp)
  FROM 
      (
        (
          SELECT value, timestamp
            FROM database 
           WHERE 
                 data_id = 100 AND
                 timestamp < ... and timestamp > ... 
        ORDER BY timestamp DESC
        ) as data
      )
GROUP BY timestamp DIV 60000
ORDER BY timestamp DESC;

Однако теперь я хочу иметь возможность построить график, например, data_id 100 против data_id 200 вместо data_id 100 против времени. Итак, как мне связать значения data_id 100 и 200 для временного шага около 1 минуты для большого набора данных?

Я уже попробовал следующее, но вызов SQL занял слишком много времени ...

SELECT a.timestamp, a.value, b.value 
  FROM 
      (
        SELECT value, timestamp 
          FROM daq_test.data_f32 
         WHERE
               data_id = 166 AND 
               timestamp < 1507720000000 AND
               timestamp > 1507334400000 
      ORDER BY timestamp DESC
      ) a,
      (
        SELECT value, timestamp 
          FROM daq_test.data_f32 
         WHERE
               data_id = 137 AND
               timestamp < 1507720000000 AND
               timestamp > 1507334400000 
      ORDER BY timestamp DESC
      ) b
WHERE a.timestamp DIV 60000 = b.timestamp DIV 60000
ORDER BY a.timestamp DESC;

1 Ответ

0 голосов
/ 14 мая 2019

Ну, я понятия не имею, в чем смысл этого запроса. Но я предлагаю создать индекс на основе ваших параметров в предложении WHERE.

Итак, если вы ищете записи с data_id и timestamp, рекомендуется создать составной индекс на основе этих двух столбцов.

Также самое значительное замедление, вероятно, вызвано отметкой времени ORDER BY. Можете ли вы сделать EXPLAIN SELECT и отредактировать свой вопрос, чтобы я мог обновить ответ с более правильным редактированием.

...