Database (e.g. MySql) :order=>'rand()' is slow.
Method | Speed | Randomness | Duplicates |
---|---|---|---|
1 cluster from random offset | fast | somewhat | no |
X times 1 record from random offset | slow for large X | total | possible |
n clusters of m record from random offset | fast | good | possible |
- As Rails plugin:
script/plugin install git://github.com/grosser/random_records.git
- As gem:
sudo gem install random_record
###Find many in single random cluster (no duplicates) Model.random(1) == [Model(id:322)] Model.random(3) == [Model(id:113),Model(id:112),Model(id:114)] Model.with_valid_email.random(3) == [Model(id:114),Model(id:112),Model(id:113)]
###Find many in many random clusters
The smaller the slower (each cluster = 1 request)
May include duplicates so use .uniq
on results.
Model.random(3, :cluster_size=>1) == [Model(id:112),Model(id:98),Model(id:214)]
###Find one random Model.random == Model(id:234) Model.with_valid_email.random == Model(id:123)
- prevent duplicates when finding in clusters (searching 9 of 10 -> many requests or tracking which offsets where already fetched)
Michael Grosser
[email protected]
Hereby placed under public domain, do what you want, just do not hold me accountable...