MySQL での効率的な単純なランダム サンプリング
多くのアプリケーションでは、大規模なデータベース テーブルから単純なランダム サンプルを抽出する機能が必要です。ただし、一見直観的な SELECT * FROM table ORDER BY RAND() LIMIT 10000 の方法を使用すると、数百万行のテーブルでは法外に遅くなる可能性があります。
より高速な解決策
より効率的なアプローチは、 rand() 関数を使用して各行に乱数を割り当て、これに基づいてテーブルをフィルタリングすることです。 number:
SELECT * FROM table WHERE rand() <= 0.3
仕組み
このメソッドは、行ごとに 0 から 1 までの乱数を生成します。この数値が 0.3 (30%) 以下の場合、その行がサンプルとして選択されます。
利点
改良版
さらに効率を高めるには、目的のサンプル サイズの 2 ~ 5 倍まで行をサンプリングし、インデックスを作成し、結果を目的のサイズにトリミングします:
SELECT COUNT(*) FROM table; -- Use this to determine rand_low and rand_high SELECT * FROM table WHERE frozen_rand BETWEEN %(rand_low)s AND %(rand_high)s ORDER BY RAND() LIMIT 1000
このメソッドはインデックス スキャンを使用してデータのサイズを削減します。ソート前なので、大きなテーブルに適しています。
以上がMySQL で単純なランダム サンプリングを効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。