所以我开始使用Push更新服务从Crypto Currency市场捕获数据。 Push udpates每小时平均产生大约60,000次更新。我有大约3周的数据,导致一个超过3200万行超过4 GB的表。即使对此表进行简单查询也只需不到15秒即可返回。 (Ubuntu桌面16.04运行在具有16 GB RAM的8核AMD上。)
慢速查询示例(需要12到15秒):
SELECT MAX(Update_Time) FROM `push_updates`
我想有几种提高性能的方法,但我认为最简单的方法是将大表拆分成较小的表。每次更新都是带有几个键的dict。我认为最简单的两个选项是:
1)我可以为每个密钥创建一个表,但这需要为每个表中的每一行复制2个数据(或至少链接到这两个数据的主键)。 2)我可以按原样保留更新表,但是白天可以将其分解。这将产生一个大约150万行的表。 (如果这仍然很慢,我可以把它分成12或6小时的块。)
虽然我对其他建议持开放态度,但此时我的偏好是选项#2 - 白天分解。这对我提出的主要问题是我使用SQLAlchemy ORM和declarative_base构建了我的代码。现在我需要找到一种动态创建每天创建的新表的类的方法。
这是Push_Update表定义:
class Push_Updates(Base):
__tablename__ = 'push_updates'
__table_args__ = { 'mysql_engine': 'InnoDB' }
ID = Column(Integer, autoincrement=True, primary_key=True)
Update_Time = Column(NUMERIC(precision='16,6'), nullable=False, unique=False)
Mrkt_ID = Column(Integer, ForeignKey('markets.ID'))
Market = relationship(Markets)
Last = Column(NUMERIC(precision='16,9'), nullable = False)
Quote_Volume = Column(NUMERIC(precision='26,9'), nullable = False)
Base_Volume = Column(NUMERIC(precision='26,9'), nullable = False)
Percent_Change = Column(NUMERIC(precision='12,9'), nullable = False)
High_24 = Column(NUMERIC(precision='16,9'), nullable = False)
Highest_Bid = Column(NUMERIC(precision='16,9'), nullable = False)
Low_24 = Column(NUMERIC(precision='16,9'), nullable = False)
Lowest_Ask = Column(NUMERIC(precision='16,9'), nullable = False)
is_Frozen = Column(Boolean, nullable = True)
起初我认为我正在过度思考这个问题,而只是实例化Push_Update类并更改__tablename__
属性。但是创建表格就像我希望的那样简单。我还没有想出如何创建表,更不用说创建一个基于Push_Update的动态类来加载数据库并根据时间范围检索数据。
这是否在SQLAlchemy的用例之外,我需要回到原始SQL?