非常に多くの回答を見た後、私はそれらすべてをPostgreSQL(9.6.3)データベースでベンチマークすることにしました。より小さな100,000テーブルを使用し、Model.order( "RANDOM()")。firstを取り除きました。
2,500,000エントリ、10列のテーブルを使用した場合、手に負えた勝者はpluckメソッドがrunner up(offset。メソッドは、私が最終的に使用するものです。これは、問題の原因となる可能性があることにも注意する必要があります。一度に複数の結果を取得するのは、それらの1つ1つが一意であり、ランダム性が低いためです。
Pluckは、25,000,000行のテーブルで100回実行された勝ちです。編集:実際には、この時間にループ内のPluckが含まれています。これを実行すると、IDの単純な反復とほぼ同じくらい高速に実行されます。しかしながら; かなりの量のRAMを消費します。
RandomModel user system total real
Model.find_by(id: i) 0.050000 0.010000 0.060000 ( 0.059878)
Model.offset(rand(offset)) 0.030000 0.000000 0.030000 ( 55.282410)
Model.find(ids.sample) 6.450000 0.050000 6.500000 ( 7.902458)
これは、ランダムを除外するために100,000行のテーブルで2000回実行されているデータです。
RandomModel user system total real
find_by:iterate 0.010000 0.000000 0.010000 ( 0.006973)
offset 0.000000 0.000000 0.000000 ( 0.132614)
"RANDOM()" 0.000000 0.000000 0.000000 ( 24.645371)
pluck 0.110000 0.020000 0.130000 ( 0.175932)