将时间序列数据存储在数据库或二进制文件中

时间:2013-01-02 08:02:41

标签: mysql database

我正在存储大量的时间序列金融市场价格数据。

通常,这些数据是按顺序写入的(即 - 数据在进入时加上时间戳,然后写入db)。

我需要根据时间戳(仅)读取数据 - 即一般查询类似于“选择2012年1月1日至2012年2月1日之间的所有数据”。

问题:如果READ性能至关重要,我最好将这些数据存储在二进制文件或mySQL数据库中吗?

在我看来,数据的特征可能更适合文件,我的初步测试似乎表明这更快(即,我可以更快地读取数据)。

1 个答案:

答案 0 :(得分:1)

您的描述仅涉及时间维度。但是其他维度是什么?可能是不同的金融工具(MSFT,IBM,AAPL等)。

金融市场数据的性质通常是按时间维度(您获得数十万股票价格的每日更新)订购,但是按金融工具维度查询(您查询单个工具的所有价格,可能受时间限制。)

因此,如果您希望获得最大的读取性能,则必须确保您的数据不是以收到的方式存储,而是以查询的方式存储,即在磁盘上,它必须由金融工具进行实际订购。

我过去在Oracle中成功实现了这一点。在那里,您基本上创建一个索引组织的表,其中包含金融工具标识符和日期作为主键(标识符需要首先)。然后,Oracle将或多或少地存储按金融工具标识符和日期排序的数据。因此,如果您查询给定时间范围内单个仪器的股票价格,所有所需数据将在连续的磁盘页面上,已经按所需顺序排列,因此查询速度非常快。

我对MySQL没有多少经验。但据我所知,您可以使用InnoDB存储引擎和聚簇索引实现相同的目标:

CREATE TABLE prices (
    ticker CHAR(10),
    date DATE,
    close NUMBER(10, 4),
    PRIMARY KEY (ticker, date)
) ENGINE=InnoDB;

请不要使用二进制文件。你会后悔的。