我想得到一個溫度計的溫度讀數給定表的平均溫度,行結構:thermometer_id, timestamp (float, julian days), value (float)
加上timestamp
的升序索引。如何製作簡單的GROUP BY使用索引?
要獲得全天5天前,我使用這個查詢:
SELECT
ROUND(AVG(value), 2), -- average temperature
COUNT(*) -- count of readings
FROM reads
WHERE
timestamp >= (julianday(date('now')) - 5) -- between 5 days
AND
timestamp < (julianday(date('now')) - 4) -- ...and 4 days ago
GROUP BY CAST(timestamp * 24 as int) -- make hours from floats, group by hours
它它工作得很好,但它的工作原理很慢,一個9MB的數據庫,行35.5,這需要超過半秒鐘才能完成,這很困難,應該不會超過幾十毫秒。它不是很快的硬件(不是SSD),但是我正準備在樹莓派上使用它,相對比較慢+每天的工作量會增加80k行。
Explain
解釋了原因:
「使用溫度B-樹GROUP BY」
我已經嘗試添加day
和hour
列使用索引只是爲了快速訪問的緣故,不過,組由於沒有使用任何指標。
如何調整此查詢或數據庫以使此查詢更快?
演員和乘員可能會在使用索引進行分組時失敗。如果你有最新版本的SQLite(3.9.2),那麼你可以嘗試[在group-by表達式上創建一個索引](http://sqlite.org/expridx.html) –
不幸的是,我有sqlite 3.7.14與python 2.7.3。我使用'set hour = CAST(timestamp * 24 as int)'創建了'hour'列,但它同樣很慢,查詢規劃器仍然使用「使用臨時b樹作爲group by」。 –