sql >> データベース >  >> RDS >> Mysql

MySQL RAND()はどのくらいの頻度で使用できますか? / dev / randomを使用していますか?

    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の外部でランダム関数を使用できます。


    1. PHP mysqlは、キーワードを使用して複数のテーブルを検索します

    2. テーブルのすべての行をループするにはどうすればよいですか? (MySQL)

    3. PostgreSQL:ASが存在しない場合はテーブルを作成します

    4. 異なるフィールドを持つ複数のテーブルでのMySQL全文検索