La façon la plus efficace de déterminer les modifications entre les lignes à l'aide de SQL

J'ai une très grande table MySQL contenant les données lues à partir d'un certain nombre de capteurs. Essentiellement, il y a un timbre et une valeur de la colonne. Je vais omettre l'id du capteur, d'autres indices plus de détails ici:

CREATE TABLE `data` (
  `time` datetime NOT NULL,
  `value` float NOT NULL
)

La value colonne change rarement, et j'ai besoin de trouver les points dans le temps lorsque ces changements se produisent. Supposons qu'il y a une valeur à chaque minute, la requête suivante renvoie exactement ce dont j'ai besoin:

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 |
+---------------------+-------+----------------+

Le seul problème est que c'est très inefficace, en raison principalement de la charge de la sous-requête. Quelle serait la meilleure façon d'optimiser, ce en utilisant les outils MySQL 5.1 a à offrir?

Une dernière contrainte est que les valeurs ne sont pas commandés avant qu'ils sont insérés dans la table de données et qu'ils pourraient être mis à jour plus tard. Cela peut affecter toute possibilité de normalisation des stratégies.

Quels indices sont là, dans le tableau?
Note: c'est une mauvaise habitude d'avoir des tables ou des champs nommés time ou datetime ou date ou float, etc.
Hormis les touches sur les colonnes qui n'apparaissent pas dans cet exemple (comme une synthèse de la clé primaire), il y a une clé unique sur la colonne du temps.
Merci pour l'astuce, mais ce n'est pas mon code. Je l'ai raccourcie et condensée pour faire de ma question de façon plus concise. Je pourrais avoir trop fait avec le respect de la colonne du temps. 🙂

OriginalL'auteur cg. | 2011-05-24