要从db获取单个随机记录,我目前正在做:
User.all.sample
但是当有100000多个用户时,只需要几秒钟就可以加载它们,只需选择一个。
从db中加载单个随机用户的最简单方法是什么?
您可以尝试以下数据库独立查询:
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用户记录。
使用Postgresql或SQLite,使用RANDOM()
:
User.order("RANDOM()").first
据推测,与RAND()
相同的MySQL也适用
User.order("RAND()").first