gpt4 book ai didi

python - 如何加速 SQLAlchemy 中的混合属性查询?

转载 作者:行者123 更新时间:2023-11-29 12:44:18 25 4
gpt4 key购买 nike

在涉及关系的 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 时(每个 parent 平均有大约 2 个 child ),速度非常慢。是否有通过索引或其他方式加快这些查询速度的好方法?

最佳答案

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

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

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

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

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

关于python - 如何加速 SQLAlchemy 中的混合属性查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33287490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com