Увидев так много ответов, я решил сравнить их все в моей базе данных PostgreSQL (9.6.3). Я использую меньшую таблицу из 100 000 и сначала избавился от Model.order ("RANDOM ()"). Так как он был уже на два порядка медленнее.
Используя таблицу с 2 500 000 записей с 10 столбцами, победителем хендсайда был метод срывания, который был почти в 8 раз быстрее, чем занявший второе место (смещение. Я запускал его только на локальном сервере, так что число может быть завышено, но его достаточно больше то, что я в конечном итоге буду использовать метод срывания, также стоит отметить, что это может вызвать проблемы, если вы отбираете более 1 результата за раз, так как каждый из них будет уникальным или менее случайным.
Pluck выигрывает 100 раз за мой стол с 25 000 000 строк.
Редактировать: на самом деле на этот раз включает в себя срыв в цикле, если я вычеркну его, он работает примерно так же быстро, как простая итерация по идентификатору. Тем не мение; он занимает довольно много оперативной памяти.
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)
Вот данные, запущенные 2000 раз в моей таблице 100 000 строк, чтобы исключить случайные
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)