Mysql で、ランダムにレコードを取り出す方法

Tsukasa OISHI

ActiveRecordで、テーブルからランダムにレコードを取り出すときは、

user = User.find(:first, :order => "RAND()")

みたいにすればいい。SQLは

select * from users order by RAND() limit 1;

というような感じになる。

ただし、レコード数が大きくなると、この order by RAND() がかなり遅くなってしまう。そのときは、ランダムなid値をアプリ側で用意して、

user = User.find(:first, :conditions => ["id = ?", rand_id])

みたいにするといい感じ。
また、selectで取り出すカラムを最小限に抑えると、結構はやくなったりするので、アプリの修正が面倒なときはこれを試してみてもいいかも。

user = User.find(:first, :select => "id", :order => "RAND()")