SQLAlchemy + MySQL大表性能建议

时间:2016-08-29 17:45:36

标签: python mysql database sqlalchemy

所以我开始使用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?

0 个答案:

没有答案