为了从数据库中获取单个随机记录,我目前正在执行以下操作:User.all.sample但是当有100000+个用户时,只需选择一个,就需要几秒钟来加载所有用户。从数据库加载单个随机用户的最简单方法是什么?
User.all.sample
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用户记录。
kxkpmulp2#
使用Postgresql或SQLite,使用RANDOM():
RANDOM()
User.order("RANDOM()").first
对于RAND()的MySQL,可能也是如此
RAND()
User.order("RAND()").first
pxyaymoc3#
经过大量的试验和错误,我发现这个解决方案是有帮助的,没有错误.
Model.find(Model.ids.sample)
Model.ids将返回数据库中所有ID的数组。然后我们在该数组上调用sample方法,该方法将返回列表中的随机项。
Model.ids
sample
aoyhnmkz4#
您可以在表中找到最大用户ID,并查找随机ID限制在此最大值内的用户。示例:
max_id = User.order(id: :desc).limit(1).pluck(:id).first user = User.find_by('id > ?', rand(max_id))
这两个查询非常快,因为您使用的是主键(id)的索引。
c9x0cxw05#
对于导轨6你可以通过记录计数来得到你想要的记录数User.all.sample(1)以上查询只返回用户的一条随机记录
User.all.sample(1)
4dbbbstv6#
您可以使用Model.all.sample.attribute在Rails控制台中获得一个示例。例如:
Model.all.sample.attribute
Contact.all.sample.name => "Bob Mcmillan"
6条答案
按热度按时间11dmarpk1#
您可以尝试以下数据库独立查询:
这一个触发两个查询,但是这一个是性能高效的,因为它仅花费37ms来获得单个随机用户记录。
而下面的查询将花费大约624.7ms
我已经检查了105510用户记录。
kxkpmulp2#
使用Postgresql或SQLite,使用
RANDOM()
:对于
RAND()
的MySQL,可能也是如此pxyaymoc3#
经过大量的试验和错误,我发现这个解决方案是有帮助的,没有错误.
Model.ids
将返回数据库中所有ID的数组。然后我们在该数组上调用sample
方法,该方法将返回列表中的随机项。aoyhnmkz4#
您可以在表中找到最大用户ID,并查找随机ID限制在此最大值内的用户。示例:
这两个查询非常快,因为您使用的是主键(id)的索引。
c9x0cxw05#
对于导轨6
你可以通过记录计数来得到你想要的记录数
User.all.sample(1)
以上查询只返回用户的一条随机记录
4dbbbstv6#
您可以使用
Model.all.sample.attribute
在Rails控制台中获得一个示例。例如: