在有大量记录的表中使用random()优化order

2024-04-19 04:49:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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吗?你知道吗


Tags: andin内容foragesqlsqlalchemysession
1条回答
网友
1楼 · 发布于 2024-04-19 04:49:18

据我所知,order by random()会生成一个完整的表扫描,这会很糟糕。你知道吗

一个选择是选择一个随机的起点,然后应用你的标准来尝试找到一个随机的结果。你知道吗

比如:

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

你可能会对此很有防御性,继续尝试随机的起始位置,直到你找到足够的结果,找到一个赢家。你知道吗

相关问题 更多 >