Reputation: 9856
I have stored a time series in a MySQL table [int(11) int(11)] The first column is epoch time in milliseconds, the second column is the value at that time.
There are 25920000 records. When I want to plot the data, I don't want to plot every millisecond but only at a certain resolution, I use the following query:
SELECT AVG(value) FROM measurements GROUP BY ts DIV (1000*60*60*24)
This takes already 1,5 minutes which is way longer than I want to achieve.
Is there a certain index I might be able to use to speed up this query?
Or is there maybe another DBMS that is better suited for this.
as requested in comments:
CREATE TABLE measurements (ts INT(11), value INT(11))
15151,11
15152,15
15153,50
15154,100
....
Note that I'm currently experimenting with integer data, in the future it will be floating point data
Upvotes: 0
Views: 63
Reputation: 15057
You can also use PERSISTENT Columns that will be generate the date on the fly and also has an index
CREATE TABLE `measurements ` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`datum` date AS (DATE(ts)) PERSISTENT,
`ts` int(11) DEFAULT NULL,
`value` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `datum` (`datum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Upvotes: 2
Reputation: 1738
to speed up things (and to make sure an index might be used successful) you could add different columns for your resolutions and precalculate those from the timestamp value. After that, add indexes to this (these) columns and it should be faster since you do not have to calculate all the values before grouping with it.
i know its not the best flexible way but probably a good tradeoff.
Edit: If you fill this table you can also precalculate those values right off, so no need to recalculate lots of data.
Upvotes: 1