如何在SQLAlchemy中加速混合属性查询?

时间:2015-10-22 17:55:23

标签: python sql postgresql sqlalchemy

有没有一种好方法可以加速查询涉及关系的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个孩子)时,它很慢。有没有一种很好的方法通过索引或其他东西来加速这些查询?

1 个答案:

答案 0 :(得分:2)

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

所以我要做的第一件事是添加索引,SQLAlchemy非常容易:

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

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

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