MySQL:查询时间序列中某个日期之前的最后一个值的最佳实践
MySQL: best practice for querying last value before a certain date in a time series
我在 MySQL 中有以下 table:
CREATE TABLE `history` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`code` CHAR(32) NOT NULL,
`value` FLOAT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `timestamp_code` (`timestamp`, `code`),
INDEX `code` (`code`),
INDEX `timestamp` (`timestamp`)
) COLLATE='utf8_general_ci' ENGINE=InnoDB;
我想知道什么是最有效地访问特定代码集的特定日期之前的最后可用值的最佳实践?
到目前为止,我提出了以下查询:
SELECT h.* FROM history h
JOIN (
SELECT code, MAX(timestamp) as 'last_ts'
FROM history WHERE
timestamp < '2015-09-04 13:50:00' AND
code IN ('119813249', '12087792', '12087797',
'127012151', '131014335', '131014378',
'132757371', '15016059', '15016062',
'150250238', '153462747', '155802712',
'156974389', '162277696', '166330444',
'166483001', '167220356', '167264923',
'167867931', '172283682', '177539478',
'177583937', '177648754', '177649011',
'187532416', '189230667', '70273253',
'70342790', '79342386', '82460282',
'98693280', '98693380')
GROUP BY code) last_price
ON last_price.last_ts = h.timestamp
AND last_price.code = h.code
上面的查询有效,但随着 table 中条目数量的增长(100'000'000 行)而变慢。
您可以下载 sample data 来填充 table。
按代码、时间戳而不是时间戳、代码创建索引。这将使 mysql 在查找每个代码的最大时间戳之前整理代码 - 并且应该更快。使用说明来验证是否使用了索引。
如果您创建了该索引 - 您就不必修改查询。
我在 MySQL 中有以下 table:
CREATE TABLE `history` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`code` CHAR(32) NOT NULL,
`value` FLOAT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `timestamp_code` (`timestamp`, `code`),
INDEX `code` (`code`),
INDEX `timestamp` (`timestamp`)
) COLLATE='utf8_general_ci' ENGINE=InnoDB;
我想知道什么是最有效地访问特定代码集的特定日期之前的最后可用值的最佳实践?
到目前为止,我提出了以下查询:
SELECT h.* FROM history h
JOIN (
SELECT code, MAX(timestamp) as 'last_ts'
FROM history WHERE
timestamp < '2015-09-04 13:50:00' AND
code IN ('119813249', '12087792', '12087797',
'127012151', '131014335', '131014378',
'132757371', '15016059', '15016062',
'150250238', '153462747', '155802712',
'156974389', '162277696', '166330444',
'166483001', '167220356', '167264923',
'167867931', '172283682', '177539478',
'177583937', '177648754', '177649011',
'187532416', '189230667', '70273253',
'70342790', '79342386', '82460282',
'98693280', '98693380')
GROUP BY code) last_price
ON last_price.last_ts = h.timestamp
AND last_price.code = h.code
上面的查询有效,但随着 table 中条目数量的增长(100'000'000 行)而变慢。
您可以下载 sample data 来填充 table。
按代码、时间戳而不是时间戳、代码创建索引。这将使 mysql 在查找每个代码的最大时间戳之前整理代码 - 并且应该更快。使用说明来验证是否使用了索引。
如果您创建了该索引 - 您就不必修改查询。