【问题标题】:Multi-column index or multiple indexes for timeseries MySQL table?时间序列MySQL表的多列索引或多个索引?
【发布时间】:2012-02-24 21:46:13
【问题描述】:

我有一个 MySQL MyISAM 表,其中包含大约 4 亿行价格数据(7GB 数据 + 9GB 索引),包含 3 列:

CREATE TABLE `prices` (
  `ts` datetime NOT NULL,
  `id` int(10) unsigned NOT NULL,
  `price` double NOT NULL,
  PRIMARY KEY (`ts`,`instrid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1$$

不同的ids 的数量(我认为基数就是这个词)约为 500,对于大多数感兴趣的时间范围,在这些时间范围内,id 的基数低于 ~20(所以有3 月 1 日至 2 日之间只有 20 个左右不同的 ID)。

查询几乎完全是以下形式:

select ts, price from prices where ts between {t1} and {t2} and id = {id}.

似乎某些索引应该加快速度。

tsid 上的组合索引或 tsid 上的单独索引会更好吗?一些第三种选择?我也很感激有关我可以学习如何为自己回答这个问题的建议。

另一种表类型(InnoDB?)是否更适合我的目的?

【问题讨论】:

    标签: mysql indexing query-optimization time-series


    【解决方案1】:

    我会在 ts、price 和 id 上使用单个组合索引 - 通常 MySQL 会执行两个操作,首先它使用索引找到行,然后从数据库中检索行。但是,如果您在索引中拥有所有数据,那么它将直接从索引中获取数据,而无需从数据库中检索该行。它被称为“覆盖索引”。

    关于数据库选择,大部分人似乎都推荐InnoDB认真使用,有一个很好的比较here

    【讨论】:

    • 同意。按以下顺序使用列创建覆盖索引(ts, id, price)
    • 一个有趣的解决方案。我会试试这个,看看那篇文章。谢谢:)
    • 你知道如果这个索引不适合内存会不会有问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2011-03-04
    相关资源
    最近更新 更多