MySQLのORDER BY RANDはランダムに値を取得してくれる
便利なのだけど、RANDを利用すると全文走査するので
大きなテーブルだと非常に重くなってしまう。

で、見つけたのが以下のAntonさんのブログ
“Do not use ORDER BY RAND()” or “How to get random rows from table?”
↑をザックリ訳してみると

・RANDは使うな

・じゃぁどうするのか
 1-1.SELECT COUNT(*) AS cnt FROM quotes
  で全件数を取得
 1-2.1-1で取得した数値からランダムな値をプログラムで生成
 1-3.SELECT quote FROM quotes LIMIT $generated_number, 1
  1-2で生成した値($generated_number)でデータを取得する

・複数取りたい場合はどうするのか
 2-1.SELECT MAX(id) AS maxid FROM quotes
  で最大のidを取得(auto_incrementされたプライマリキー)
 2-2.2-1で取得した値を最大値としてランダムなidを生成
 2-3.SELECT quote FROM quotes WHERE id IN ($idlist)
  2-2で生成した配列($idlist)でデータを取得する

・削除とかしてidが連番じゃなかったらどうするのか
 3-1.2-2で必要な数より多くidを生成
 3-2.SELECT quote FROM quotes WHERE id IN ($list_with_10_times_more_ids_than_x) LIMIT $x
  3-1で生成した配列($list_with_10_times_more_ids_than_x) +
  $xで必要な個数を指定する
 →RANDで取得するよりはずっと早い!!らしい

・「削除とかしてidが連番じゃなかったらどうするのか」の例
 IDを5個生成して3つデータを取得するSQL
 SELECT quote FROM quotes WHERE id IN ('1','5','7','8','9') LIMIT 3

訳は怪しいですがこんな感じでしょうか。
ランダムなデータ取得っていろんなところで利用されていると思うのですが
みんなどうやっているのでしょうかねぇ。