ruby-on-rails 从数据库中获取随机记录?

6mzjoqzu  于 2023-02-10  发布在  Ruby
关注(0)|答案(6)|浏览(191)

为了从数据库中获取单个随机记录,我目前正在执行以下操作:
User.all.sample
但是当有100000+个用户时,只需选择一个,就需要几秒钟来加载所有用户。
从数据库加载单个随机用户的最简单方法是什么?

11dmarpk

11dmarpk1#

您可以尝试以下数据库独立查询:

User.find(User.pluck(:id).sample)
[DEBUG]  (36.5ms)  SELECT `users`.`id` FROM `users`
[DEBUG] User Load (0.5ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 58229 LIMIT 1

这一个触发两个查询,但是这一个是性能高效的,因为它仅花费37ms来获得单个随机用户记录。
而下面的查询将花费大约624.7ms

User.order("RAND()").first
[DEBUG] User Load (624.7ms)  SELECT  `users`.* FROM `users`  ORDER BY RAND() LIMIT 1

我已经检查了105510用户记录。

kxkpmulp

kxkpmulp2#

使用PostgresqlSQLite,使用RANDOM()

User.order("RANDOM()").first

对于RAND()MySQL,可能也是如此

User.order("RAND()").first
pxyaymoc

pxyaymoc3#

经过大量的试验和错误,我发现这个解决方案是有帮助的,没有错误.

Model.find(Model.ids.sample)

Model.ids将返回数据库中所有ID的数组。然后我们在该数组上调用sample方法,该方法将返回列表中的随机项。

aoyhnmkz

aoyhnmkz4#

您可以在表中找到最大用户ID,并查找随机ID限制在此最大值内的用户。示例:

max_id = User.order(id: :desc).limit(1).pluck(:id).first
user = User.find_by('id > ?', rand(max_id))

这两个查询非常快,因为您使用的是主键(id)的索引。

c9x0cxw0

c9x0cxw05#

对于导轨6
你可以通过记录计数来得到你想要的记录数
User.all.sample(1)
以上查询只返回用户的一条随机记录

4dbbbstv

4dbbbstv6#

您可以使用Model.all.sample.attribute在Rails控制台中获得一个示例。
例如:

Contact.all.sample.name
=> "Bob Mcmillan"

相关问题