У меня очень большая таблица MySQL, содержащая данные, считанные с нескольких датчиков. По сути, есть отметка времени и столбец значений. Я опущу идентификатор датчика, здесь указываются другие подробности:
CREATE TABLE `data` (
`time` datetime NOT NULL,
`value` float NOT NULL
)
Столбец value
редко изменяется, и мне нужно найти моменты времени, когда эти изменения происходят. Предположим, что каждую минуту есть значение, следующий запрос возвращает именно то, что мне нужно:
SELECT d.*,
(SELECT value FROM data WHERE time<d.time ORDER by time DESC limit 1)
AS previous_value
FROM data d
HAVING d.value<>previous_value OR previous_value IS NULL;
+---------------------+-------+----------------+
| time | value | previous_value |
+---------------------+-------+----------------+
| 2011-05-23 16:05:00 | 1 | NULL |
| 2011-05-23 16:09:00 | 2 | 1 |
| 2011-05-23 16:11:00 | 2.5 | 2 |
+---------------------+-------+----------------+
Единственная проблема в том, что это очень неэффективно, в основном из-за зависимого подзапроса. Как лучше всего оптимизировать этот процесс с помощью инструментов, предлагаемых MySQL 5.1?
Последнее ограничение заключается в том, что значения не упорядочиваются до того, как они будут вставлены в таблицу данных, и что они могут быть обновлены позднее. Это может повлиять на любые возможные стратегии нормализации.