MySQLのRAND遅くて困ること多いですよね。
プログラマになりたての頃は常に速いRANDの方法を考えてました。
最近になってやっと常套句が見つかったので紹介します。
SELECT id
FROM random AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM random)) AS id_)
AS r2
WHERE r1.id >= r2.id_
ORDER BY r1.id ASC
LIMIT 1
受け売りなんですが、このSQLを見た時は感動しました。
AUTO_INCREMENTを使用しているテーブルならそのまま使えるでしょう。
物にもよりますが、 WHERE r1.id >= r2.id_ の後に評価式を加えて使います。
ブログサイトとかのランダム記事紹介にいいですね。
私の環境では40,000件のレコードからこのクエリでランダムにレコードを抽出すると1msかかりませんでした。
LIMITを変更してももちろん使えます。
0 件のコメント:
コメントを投稿