MySQLの疑似乱数ジェネレータは完全に決定論的です。ドキュメントによると:
MySQLはさまざまなオペレーティングシステムで動作するように設計されているため、/ dev / randomを使用できません。その中には、/ dev/randomがないものもあります。
MySQLは、time(0)
によって返される整数を使用して、サーバーの起動時にデフォルトのシードを初期化します。 ソース行に興味がある場合は、ファイルsql / mysqld.cc、関数init_server_components()
のMySQLソースにあります。 。自分自身を再シードすることはないと思います。
その後の「ランダムな」数は、シードのみに基づいています。ソースファイルmysys_ssl/my_rnd.cc、関数my_rnd()
を参照してください 。
ランダム化のパフォーマンスと品質の両方について、ランダム選択タスクのベストプラクティスの解決策は、最小の主キー値と最大の主キー値の間のランダム値を生成することです。次に、そのランダムな値を使用して、テーブルの主キーを選択します。
SELECT ... FROM MyTable WHERE id > $random LIMIT 1
=の代わりに>を使用する理由は、行が削除またはロールバックされたためにIDにギャップがあるか、WHERE句に他の条件があり、条件に一致する行の間にギャップがある可能性があるためです。 。
この大なりの方法の欠点:
- このようなギャップに続く行は、選択される可能性が高く、ギャップが大きいほど、選択される可能性が高くなります。
- ランダムな値を生成する前に、MIN(id)とMAX(id)を知っておく必要があります。
- 複数のランダムな行が必要な場合は、うまく機能しません。
この方法の利点:
- テーブルのサイズがそれほど大きくない場合でも、ORDER BY RAND()よりもはるかに高速です。
- SQLの外部でランダム関数を使用できます。