我正在使用SQLAlchemy来获取一个满足条件的随机结果(从计数结果中,我根据一些东西只选择了一个,这不能在sql级别上进行选择),它满足查询条件

for p in session.query(PersonModel).filter(and_(PersonModel.age >25, PersonModel.gender == 1)).order_by(func.rand()).limit(count):
    # some calculations and return only one


问题是人的表很大,超过30万条记录。我可以以任何方式优化此查询,但仍返回随机值吗?

最佳答案

据我了解,按random()进行排序会生成全表扫描,这将很糟糕。

一种选择是选择一个随机的起点,然后应用您的条件来尝试找到一个随机的结果。

所以像这样:

start = random.randint(max_id)
for p in session.query(PersonModel).filter(id__gte=start).limit(count):
    # some calculations and return only one


您可能需要对此采取防御措施,继续尝试随机的起始位置,直到找到足够的结果来找到获胜者。

09-30 23:55