У меня очень большая таблица 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 может предложить?
Последнее ограничение состоит в том, что значения не упорядочены до того, как они будут вставлены в таблицу данных, и что они могут быть обновлены позднее. Это может повлиять на любые возможные стратегии де-нормализации.