【问题标题】:How can I speed up hybrid property queries in SQLAlchemy?如何加快 SQLAlchemy 中的混合属性查询?
【发布时间】:2015-10-22 17:55:23
【问题描述】:

有没有一种好方法可以加快查询 SQLALchemy 中涉及关系的混合属性?我有以下两个表:

class Child(Base):
     __tablename__ = 'Child'
     id = Column(Integer, primary_key=True) 
     is_boy = Column(Boolean, default=False)
     parent_id = Column(Integer, ForeignKey('Parent.id'))


class Parent(Base):
     __tablename__ = 'Parent'
     id = Column(Integer, primary_key=True) 
     children = relationship("Child", backref="parent")

     @hybrid_property
     def children_count(self):
         return self.children_count.count()

     @children_count.expression
     def children_count(cls):
         return (select([func.count(Children.id)]).
            where(Children.parent_id == cls.id).
            label("children_count")
            )

当我在 50,000 行中查询 Parent.children_count(每个父母平均有大约 2 个孩子)时,速度非常慢。有没有一种通过索引或其他方式来加快这些查询的好方法?

【问题讨论】:

    标签: python sql postgresql sqlalchemy


    【解决方案1】:

    默认情况下,PostgreSQL 不会在外键上创建索引。

    所以我要做的第一件事就是添加一个索引,这让 SQLAlchemy 变得非常简单:

    parent_id = Column(Integer, ForeignKey('Parent.id'), index=True)
    

    考虑到您当前数据集的大小,这可能会导致足够快的检索时间 - 试试看。请务必连续尝试几次查询以预热 PostgreSQL 缓存。

    对于更大的数据集,或者如果查询仍然不够快,您可以考虑预先计算计数并缓存它们...有多种缓存方法,最简单的方法可能是抛出一个额外的列在您的 Parent 表中,并确保每当添加新的孩子时,您都会编写应用程序逻辑来增加计数。这样有点hacky。另一种选择是在 Redis/memcache 中缓存计数,甚至使用物化视图(如果计数偶尔过时几分钟是可以的,这是一个很好的解决方案)。

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 2018-08-12
      • 2014-08-01
      • 2011-10-04
      • 1970-01-01
      • 2022-01-22
      • 2015-06-15
      • 2020-07-02
      相关资源
      最近更新 更多