MySQL表设置库存信息

时间:2015-06-22 19:44:01

标签: mysql database-design

我每天收集大约3到6百万行股票数据并将其存储在MySQL数据库中。

所有数据都来自盈透证券,每一条信息都包含以下五个字段:符号,日期,时间,价值和类型(类型是我收到的数据类型的信息,如价格,交易量等)

这是我的create table语句。 idticks只是我唯一的密钥,但我几乎无法在查询中使用它。

CREATE TABLE `ticks` (
`idticks` int(11) NOT NULL AUTO_INCREMENT,
`symbol` varchar(30) NOT NULL,
`date` int(11) NOT NULL,
`time` int(11) NOT NULL,
`value` double NOT NULL,
`type` double NOT NULL,
KEY `idticks` (`idticks`),
KEY `symbol` (`symbol`),
KEY `date` (`date`),
KEY `idx_ticks_symbol_date` (`symbol`,`date`),
KEY `idx_ticks_type` (`type`),
KEY `idx_ticks_date_type` (`date`,`type`),    
KEY `idx_ticks_date_symbol_type` (`date`,`symbol`,`type`),
KEY `idx_ticks_symbol_date_time_type` (`symbol`,`date`,`time`,`type`)
) ENGINE=InnoDB AUTO_INCREMENT=13533258 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY (`date`)
PARTITIONS 1 */;

正如你所看到的,我不知道我在做什么,因为我只是继续创建索引以使我的查询更快。

现在数据存储在一台速度相当慢的计算机上用于测试目的,所以我知道我的查询速度不是那么快(我有一个6核,64g的RAM,明天到达的SSD机器应该帮助显着)

话虽如此,我正在运行像这样的查询

select time, value from ticks where symbol = "AAPL" AND date = 20150522 and type = 8 order by time asc

上面的查询,如果我不限制它,则在我的一个测试日中返回12928条记录,如果我从清除的缓存中执行此操作则需要10.2秒。

我正在做很多图表,并且最终希望能够像我需要的那样查询数据。现在我还没有注意到在获得一天的数据价值与获得整天的数据之间的速度差异很大。让这些查询响应得足够快,以至于当我移动到第二天/屏幕时几乎没有任何延迟,这将是很酷的。

我正在使用的另一个查询用于我正在编写的程序的可用性以与数据交互包括

String query = "select distinct `date` from ticks where symbol = '" + symbol + "' order by `date` desc";

但我的大部分需求是能够从特定日期为特定符号提取特定类型的数据,例如我的第一个查询。

我已经搜索了整个地方,我想我明白创建大量索引会使数据库变大并降低输入速度(我在忙碌的一天每秒获得大约300条信息)。我应该单独索引每一列吗?

如果它意味着响应性界面,我愿意为事情投入更多硬盘。

基本上,我的问题与我的桌子的创建/改变有关。基于上述问题,你能想到我能做些什么来加快速度吗?还是一个可以帮助我的索引系统? InnoDB甚至是正确的引擎吗?我尝试用谷歌搜索这个与MyISam相比,经过几个小时后,我仍然不确定。

谢谢:)

2 个答案:

答案 0 :(得分:0)

您正在创建历史数据库,因此MyISAM可以和InnoDB一样工作。 InnoDB是一个事务性关系数据库,更适用于具有多个必须保持同步的表的关系数据库。

您的Stock表格如下所示。

Stock
-----
Stock ID (idticks)
Symbol
Date
Time
Value 
Type

如果将日期和时间合并到时间戳列中,并将这些类型解压缩,那会更好。

Stock
-----
Stock ID
Symbol
Time Stamp
Volume
Open
Close
Bid
Ask
...

这使得数据库更容易为特定类型的查询返回行,例如close值。

就索引而言,您可以根据需要创建任意数量的索引。您正在添加(插入)信息,因此增加的信息添加时间会因查询信息的时间减少而抵消。

我有一个股票ID的主要索引,以及符号和时间戳下降的唯一索引。您还可以拥有最常查询的值的索引,例如“关闭”。

答案 1 :(得分:0)

  • 将日期和时间合并到DATETIME字段
  • 假设价格和数量总是在一起,将它们组合在一起(2列),并在type时消除。
  • 摆脱AUTO_INCREMENT;更改为PRIMARY KEY(symbol, datetime)
  • 删除任何其他索引左侧的索引。
  • 使用DATETIME后,使用日期范围查找单个日期中的所有内容(如果需要)。 使用DATE(datetime) = '...',表现会很糟糕。
  • Symbol可能是ascii,而不是utf8。
  • 使用InnoDB,主键的聚类可能是有益的。
  • 您是否希望收集(和使用)比innodb_buffer_pool_size更多的数据?如果是这样,我们需要讨论您的SELECTs并查看PARTITIONing

进行这些更改,然后再回来寻求更多建议/滥用。