数据库设计问题

Dan*_*ani 4 mysql database financial

我以原始形式(csv和二进制)积累了大量数据 - 每天4GB,准确几个月.

我决定加入文明世界并使用数据库来访问数据,我想知道什么是正确的布局; 格式非常简单:每次勾选几次(出价,询问,时间戳等)x高达0.5万亿/天x数百种金融工具x数据.

有一个带有MYISAM的MySQL服务器(我知道这种用法是正确的引擎)在商用硬件上运行(2 x 1GB RAID 0 SATA,核心2 @ 2.7GHz)

什么是正确的数据库布局?表/索引应该如何?这种情况的一般建议是什么?你会预测到什么会给我带来陷阱?

编辑:我的常见用法是简单查询,以提取特定日期和工具的时间序列信息,例如

SELECT (ask + bid) / 2
  WHERE instrument='GOOG'
  AND date = '01-06-2008'
  ORDER BY timeStamp;
Run Code Online (Sandbox Code Playgroud)

编辑:我试图将所有数据填入由timeStamp索引的一个表中但速度太慢 - 因此我认为它需要更精细的方案.

cle*_*tus 7

您没有真正说明您的背景是什么以及您对编程和数据库设计了解多少.听起来你应该做一些阅读.从概念上讲,您的设计相当简单.您的描述只标识了两个实体:

  • 金融工具; 和
  • 引用.

因此,您需要确定属性.

金融工具:

  • 安全码;
  • 市场;
  • 等等

引用:

  • 时间戳;
  • 金融工具;
  • 竞标价格; 和
  • 问价格.

对金融工具的提及就是所谓的外键.每个表还需要一个主键,可能只是一个自动增量字段.

在概念上相当简单.

CREATE TABLE instrument (
  id BIGINT NOT NULL AUTO_INCREMENT,
  code CHAR(4),
  company_name VARCHAR(100),
  PRIMARY KEY (id)
);

CREATE TABLE quote (
  id BIGINT NOT NULL AUTO_INCREMENT,
  intrument_id BIGINT NOT NULL,
  dt DATETIME NOT NULL,
  bid NUMERIC(8,3),
  ask NUMERIC(8,3),
  PRIMARY KEY (id)
)

CREATE INDEX instrument_idx1 ON instrument (code);

CREATE INDEX quote_idx1 ON quote (instrument_id, dt);

SELECT (bid + ask) / 2
FROM instrument i
JOIN quote q ON i.id = q.instrument_id
WHERE i.code = 'GOOG'
AND q.dt >= '01-06-2008' AND q.dt < '02-06-2008'
Run Code Online (Sandbox Code Playgroud)

如果您的数据集足够大,您可能希望在表格中包含(bid + ask)/ 2,这样您就不必动态计算.

好的,这就是规范化的观点.在此之后,您可能需要开始进行性能优化.考虑一下这个关于在MySQL中存储数十亿行的问题.分区是MySQL 5.1+的一个特性(相当新).

但另一个要问自己的问题是:你需要存储所有这些数据吗?我问这个的原因是我曾经在网上经纪工作,我们只存储了一个非常有限的窗口的所有交易,交易将是一个比报价更小的数据集,你似乎想要.

存储数十亿行数据是一个严重的问题,而且你真的需要认真帮助解决.