У меня есть база данных измерений, которые показывают датчик, показание и отметку времени, в которой были сделаны данные. Измерения записываются только в случае изменения. Я хочу создать набор результатов, который показывает диапазон, в котором каждый датчик считывает определенное измерение.MySQL - перетаскивание точек данных в диапазоны
Временные метки в миллисекундах, но я выводя результат в секундах.
Вот таблица:
CREATE TABLE `raw_metric` (
`row_id` BIGINT NOT NULL AUTO_INCREMENT,
`sensor_id` BINARY(6) NOT NULL,
`timestamp` BIGINT NOT NULL,
`angle` FLOAT NOT NULL,
PRIMARY KEY (`row_id`)
)
Сейчас я получаю результаты, я хочу с помощью подзапроса, но это довольно медленно, когда есть много точек данных:
SELECT row_id,
HEX(sensor_id),
angle,
(
COALESCE((
SELECT MIN(`timestamp`)
FROM raw_metric AS rm2
WHERE rm2.`timestamp` > rm1.`timestamp`
AND rm2.sensor_id = rm1.sensor_id
), UNIX_TIMESTAMP() * 1000) - `timestamp`
)/1000 AS duration
FROM raw_metric AS rm1
По существу , чтобы получить диапазон, мне нужно получить следующее чтение (или использовать текущее время, если нет другого чтения). Подзапрос находит минимальную метку времени, которая является более поздней, чем текущая, но находится от одного и того же датчика.
Этот запрос не будет происходить очень часто, поэтому я бы предпочел не добавлять индекс в столбец timestamp и замедлять вставки. Я надеялся, что у кого-то появится предложение относительно альтернативного способа сделать это.
UPDATE: row_id-х должен увеличиваться вместе с временными метками, но она не может быть гарантирована из-за задержек в сети. Таким образом, возможно, что запись с более низким значением row_id появляется ПОСЛЕ более позднего row_id, хотя и маловероятна.
Правильный способ улучшить производительность этого подзапроса - это указать индекс на 'raw_metric (sensor_id, timestamp)'. Я бы предложил добавить индекс и проверить производительность вставок. –
@GordonLinoff Да, это был бы лучший способ улучшить подзапрос, но есть ли другой (надеюсь, лучший) способ сделать это _without_ подзапроса? –
@GordonLinoff Как создать временную таблицу raw_metric с индексированными временными метками? –