D009c93da76fe811115051bf691cc566
2015/11/24 15:55:44 投稿
1

spades sampleの代わりにDBでランダムソート hearts

ActiveRecordを利用して、取得結果のうちランダムにx件取得したい場合、
1. sampleメソッドをを利用するよりもDBのRANDOM関数でsortしたほうがパフォーマンスは向上する
- DB依存になるので、複数種類のDBを開発や本番で使い分ける場合は注意する必要がある
- 大量データの場合にDBで負荷の高い処理になる
2. idだけを取得してsampleで必要な件数分抽出し、再度DBに問い合わせる
- 問い合わせ回数は+1になるが、indexが有効になる

Before

User.all.sample(3)

After

# 1. orderでRANDOM関数を利用するケース
# mysqlの場合
User.order('RAND()').limit(3)
# sqlite3、postgresqlの場合
User.order('RANDOM()').limit(3)

# 2. idを一度取得した上で再度SQLを発行するケース
# orderでRANDOM関数を利用するケースではデータ量が増加した場合にDBに負荷がかかる
# ランダムにidを取得した後必要なレコードだけを取得したほうが負荷はかからない
ids = User.pluck(:id).sample(3)
User.where(id: ids)

みんなのコメント

D009c93da76fe811115051bf691cc566
talktome
2015/11/26 10:31:07 投稿

社内のエンジニアからソートでRANDOM関数使うのはよくないよ と指摘をいただいたのでさらに直したい。