快速高效的随机查询集 - Django

0 投票
1 回答
1121 浏览
提问于 2025-04-18 10:49

我在StackOverflow上看到一些关于Django中随机查询集的帖子。我发现大家都说用order_by('?')这个方法速度慢且效率低,但我自己的经验并没有这样觉得。

我有一个表格,里面有30,000条记录(最终的生产版本大约会有200,000条记录)。我可以把这些记录分成大约10,000到15,000条记录的小表。

所以,我想快速有效地随机获取100条(可能是200条)记录。根据我个人的看法,创建一个包含100个随机数字的列表并不是一个好主意,因为有些主键可能会缺失(比如因为删除等原因)。

而且,我不想生成一个随机数字,然后再取后面99条记录。我会使用Postgresql(没有特别的原因……如果有更好的选择我也可以换)。我测试过order_by('id')[:100]这个方法,感觉速度很快(我觉得)。每次生成列表只花了大约0.017秒。

  • 为什么文档上说这个方法不适合随机操作?
  • 你更喜欢哪种随机方法?
  • 有没有更好的办法来实现这个?

1 个回答

1
ORDER BY random()
LIMIT n

这种方法是可行的,但速度很慢,因为表中的每一行都得被考虑到。
对于3万行的数据,这种方法还是比较快的,但如果是3000万行,就没那么快了。

我建议你看看这个相关的问题:
在PostgreSQL中选择随机行的最佳方法

撰写回答