有没有一种好方法可以加速查询涉及关系的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个孩子)时,它很慢。有没有一种很好的方法通过索引或其他东西来加速这些查询?
答案 0 :(得分:2)
默认情况下,PostgreSQL不会在外键上创建索引。
所以我要做的第一件事是添加索引,SQLAlchemy非常容易:
parent_id = Column(Integer, ForeignKey('Parent.id'), index=True)
考虑到当前数据集的大小,这可能会导致足够快的检索时间 - 试试看。请务必连续几次尝试查询以预热PostgreSQL缓存。
对于更大的数据集,或者如果查询仍然不够快,你可以考虑预先计算计数并缓存它们......有许多方法可以缓存,最简单的黑客攻击可能是您的父表中的额外列,只需确保添加新子项时您编写应用程序逻辑以增加计数。这样有点hacky。另一种选择是在Redis / memcache中缓存计数,甚至使用物化视图(如果计数偶尔会过时几分钟,这是一个很好的解决方案)。