notebook

都内でWEB系エンジニアやってます。

MySQLでのRAND()関数

RAND関数の話

大量のレコードから100件をランダムで取得したいときの話

Softelメモ :【MySQL】ランダムにレコードを取り出す方法のひとつ http://www.softel.co.jp/blogs/tech/archives/2274

上記記事を読んでなるほどと思ったので実際に試してみました。

mysql 263>select count(id) from t;
+-------------------+
| count(id)         |
+-------------------+
|            638733 |
+-------------------+
1 row in set (10.72 sec)

60万件のレコードが入ったテーブルに対して試してみます。

select * from t order by rand() limit 100;
100 rows in set (4 min 6.77 sec)

4min...とても時間が掛かります

select * from t where rand() < 0.0002 limit 100;
100 rows in set (3.16 sec)

予想通りだけど差が激しすぎてびっくりしました。

ついでに主キーのみを抽出するように変更して試してみました。

ORDER BY RAND()

select id from t order by rand() limit 100;
100 rows in set (0.65 sec)

WHERE句でRAND()

select id from t where rand() < 0.0002 limit 100;
100 rows in set (0.24 sec)

この結果だけ見ると、SELECT時に主キーだけ取り出せば、ORDER BY RAND()使っても良いかなと思うけどインデックスが効くだけでこんなに違うものなのか。。。とか思ったり

どちらにしてもWHERE句にRANDを含めるほうが早くなりそうなので、RAND関数使う時は気をつけようと思いました。