我有一個非常大的MySQL表,其中包含從大量傳感器讀取的數據。本質上,有一個時間戳和一個值列。我就省略了傳感器ID,此指標的其他細節:如何高效地確定使用SQL的行之間的更改
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所提供的工具來優化這個最好的方法是什麼?
最後一個約束是這些值在它們被插入數據表之前沒有排序,並且它們可能在稍後的時間點被更新。這可能會影響任何可能的非標準化策略。
表中有什麼索引? – 2011-05-24 11:55:23
旁註:它有一個壞習慣,有一個名爲'time'或'datetime'或'date'或'float'的表或字段等。 – 2011-05-24 11:57:56
@ypercube:除了本例中未顯示的列上的鍵(如合成的主鍵),時間列上有一個唯一的鍵。 – 2011-05-24 12:03:36