【问题标题】:MySQL: best practice for querying last value before a certain date in a time seriesMySQL:查询时间序列中某个日期之前的最后一个值的最佳实践
【发布时间】:2015-09-09 16:22:23
【问题描述】:

我在 MySQL 中有下表:

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

上述查询有效,但随着表中条目数的增长(100'000'000 行)变慢。

您可以下载sample data 来填充表格。

【问题讨论】:

    标签: mysql select query-optimization


    【解决方案1】:

    按代码、时间戳而不是时间戳、代码创建索引。这将让 mysql 在查找每个代码的最大时间戳之前对代码进行排序 - 并且应该更快。使用 explain 来验证索引是否被使用。

    如果您创建该索引 - 您不应该修改您的查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多