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
訳は怪しいですがこんな感じでしょうか。
ランダムなデータ取得っていろんなところで利用されていると思うのですが
みんなどうやっているのでしょうかねぇ。
便利なのだけど、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
訳は怪しいですがこんな感じでしょうか。
ランダムなデータ取得っていろんなところで利用されていると思うのですが
みんなどうやっているのでしょうかねぇ。
Comment
コメントする