嗨,最近我需要从不同的交易所导入市场数据,并对其进行分析。
市场表很简单,它由下面的列组成
market_name varchar(45) => this will be exchange name
market_type varchar(5) => buy sell bids of asks
currency varchar(8) => cur1_cur2 e.g usd_eur
volume decimal(30,10)
price decimal(30,10)
import_time int => unix time
由于协议中对从不同交换机获取数据的限制,我最多只能每5秒更新一次数据。
现在的问题是:
每5秒一次,我将进口两个市场类型的买卖。每个市场类型都会有100张唱片。
所以,在一天的时间里,我将进口
( 86400 / 5 ) * 2 * 100 = 3,456,000 row
在一个月的时间里我将进口
3,456,000 * 30 = 10,368,000 row
目前我们有5种货币,每种2种货币,这意味着我们将在一个月内进口大约100,368,000美元。
现在,对于当前的分析,我们将输出以下数据:
您将看到一些数据暂时不会被使用,但是我们仍然需要保留它以供将来使用。
有什么最好的方法来解决这个问题吗?
目前,我一直使用MySQL作为我的数据库,但我不确定它是否是正确的数据库。
发布于 2015-03-02 02:32:38
第一步。正常化。将market_name和market_type以及货币从庞大的VARCHAR转换为ENUM或TINYINT。这会把数据减少一半。十进制(30,10)需要14个字节,而且精度远高于所需。找出最大价值是什么。小数位数是否限制在2位以内,就像目前在美国一样常见?还是你需要更多的小数位。浮动(4个字节,大约7个有效数字)做什么?这一变化也将节省大量资金。
第二步,决定你是否需要“永远”的数据。如果不是,“清洗”政策是什么?按月划分可能会更好。这将使清除非常简单和快速,此外,它可能有助于一些查询。
第三步。请向我们展示实际的选择;我们需要进一步优化它们,另外看看还可以做什么收缩/优化/等等。
第四步:“汇总表”有帮助吗?也就是说,比起上个月保存5秒的数据,1分钟,甚至1小时,数据就足够了吗?这将节省大量的空间,并极大地加快查询速度。
步骤5.在决定了PARTITIONing和选择之后,让我们讨论INDEXes。
我可以详细说明其中的任何一个,你想要更多的细节吗?
发布于 2015-03-04 00:09:04
第一步:标准化的好主意,我可以使小数点在4左右变小。我听说浮点数在计算价格相关数字方面名声不好。
第二步:这就是我们还不知道的问题,所以只需保留一切:D
第三步:我们从所有的5秒中得到OHLC的价格,我们更新到每个只节省15分钟,所以现在保存的数据应该少得多。
第四步:我给了他们一分钟,他们说慢点,哈哈。
第五步:除了价格和成交量外,几乎所有的东西都有索引。
我更喜欢SELECT 1,因为它通常非常慢:D,我稍后将select放在下面的答案中。
发布于 2015-03-04 00:24:58
我的数据正在向这个结构变化。
market_name varchar(45)
market_currency_pair varchar(10)
market_type varchar(5)
market_time datetime
market_position_id int(11)
average_volume decimal(30,10)
open_value decimal(30,10)
high_value decimal(30,10)
low_value decimal(30,10)
close_value decimal(30,10)
我可以减少列的一部分:D,顺便说一句,您如何计算每种类型的字节?
我还没有select查询,但这是一个场景:
我最关心的是我是否保存了正确的数据,这就是我每5s (v是体积,p是价格)的grep。
market_position_id first 5s second 5s third 5s ... last 5s
1 v:10,p:20 v:11,p:30 v:8,p:16 v:12,p:15
2 v:11,p:30 v:12,p:28 v:10,p:17 v:11,p:14
and so on
然后,我总结如下,这将保存到上表:
market_position_id average_volume open high low close
1 9.6 20 30 15 15
2 11 30 30 14 14
and so on
https://stackoverflow.com/questions/28270047
复制相似问题