Rails 5从db获取随机记录?

问题描述 投票:5回答:2

要从db获取单个随机记录,我目前正在做:

User.all.sample

但是当有100000多个用户时,只需要几秒钟就可以加载它们,只需选择一个。

从db中加载单个随机用户的最简单方法是什么?

ruby-on-rails activerecord ruby-on-rails-5
2个回答
11
投票

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

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

这个会触发两个查询,但这个查询性能很高,因为只需37毫秒即可获得单个随机用户记录。

而以下查询大约需要624.7ms

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

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


1
投票

使用Postgresql或SQLite,使用RANDOM()

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

据推测,与RAND()相同的MySQL也适用

User.order("RAND()").first
© www.soinside.com 2019 - 2024. All rights reserved.