从大表的子集中对随机行进行最快查询 - postgresql

Posted

技术标签:

【中文标题】从大表的子集中对随机行进行最快查询 - postgresql【英文标题】:Fastest query for random row from subset of large table - postgresql 【发布时间】:2015-09-12 20:14:07 【问题描述】:

我正在使用 Rails 和 Postgresql。我有一个非常大的表,其中包含一个名为 status 的列。从这个状态列中,很多行的值为 1。我想根据状态列中值为 1 的所有行选择一个随机行。每行也有一个 id,它们是连续的。

获取此随机行的最快方法是什么?

【问题讨论】:

我建议您也检查一下***.com/questions/8674718/…,以便很好地讨论如何有效地执行此查询 【参考方案1】:

尝试使用ActiveRecord解决方案,例如:

Model_name.where(status: 1).limit(1).order("RANDOM()")

或者:

Model_name.where(status: 1).order("RANDOM()").first

希望这会有所帮助。

【讨论】:

如果我只需要 1 行,为什么限制为 5?是不是打错字了? 您可以使用.first 所以它只是使子集的顺序随机并选择第一个?不需要遍历所有记录吧? 如何更改第二行以选择 status = 1 的子集,第二列可以说 apples 不等于 5?【参考方案2】:

你可以玩OFFSET选项

SELECT * FROM users WHERE status = 1 OFFSET random()*I LIMIT 1;

I 是表中的行数。

【讨论】:

表中不断变化的行数是多少? 你的意思可能是LIMIT 1 你可以写offset random() * (select count(*) from users)

以上是关于从大表的子集中对随机行进行最快查询 - postgresql的主要内容,如果未能解决你的问题,请参考以下文章

如何随机打乱 bigquery 数据集中大表的所有行?

MySQL 性能:在大表中排序很慢,即使过滤的子集很小

SQL怎么从大表里面 查询包含小表的内容?

从大表中检索聚合数据的更快方法?

如何从大表中读取所有行?

为啥从大表中查询 COUNT() 比 SUM() 快得多