MySQL の ORDER BY RAND() 関数は実際にランダム選択アルゴリズムを使用していますか?

Patricia Arquette
リリース: 2024-11-03 14:08:30
オリジナル
426 人が閲覧しました

Does MySQL's ORDER BY RAND() Function Actually Use a Random Selection Algorithm?

MySQL の ORDER BY RAND() 関数はランダム選択アルゴリズムですか?

データベース操作の領域では、真にランダムでデータを取得します順序は難問になる可能性があります。 MySQL の ORDER BY RAND() 関数は、長い間この目的に使用されるツールでしたが、その見かけのランダム性の背後にある基礎的なメカニズムは、ややわかりにくいままでした。

ORDER BY RAND() はランダムな列を追加するという想定にもかかわらず、ソート前のテーブルですが、最近の研究ではこれが当てはまらないことが証明されています。代わりに、MySQL は、その意図されたランダム選択を実現するために別の戦略を採用しています。

実際、Jay がブログで提案したクエリは、ランダムな行を取得するための最も効率的な方法であることが証明されています。このクエリは、テーブルの最大 ID 範囲内でランダムな ID を生成するサブクエリとテーブルを結合します。このランダム ID 以上の ID を持つ行にテーブル行をフィルタリングすることにより、クエリはランダムな行を迅速に取得します。

ただし、3 つの同様のクエリの実行時間に関して、独特の観察が行われています。

  • SELECT * FROM table ORDER BY RAND() LIMIT 1; (30 ~ 40 秒)
  • SELECT ID FROM table ORDER BY RAND() LIMIT 1; (0.25 秒)
  • SELECT id, username FROM table ORDER BY RAND() LIMIT 1; (90 秒)

3 つのクエリはすべて 1 つの列による並べ替えを必要とするため、これらのさまざまな実行時間は直観に反しているように見えます。この不一致はインデックス作成に起因している可能性があります。

2 番目のクエリでは、id 列にインデックスが付けられ、データへの迅速なアクセスが可能になります。ただし、3 番目のクエリにユーザー名などの追加の列を含めると、MySQL が各行を読み取り、これらの値にメモリを割り当てる必要があり、実行時間が大幅に増加します。

結論として、MySQL の ORDER BY RAND() 関数は真のランダム選択アルゴリズム。代わりに、ランダムな ID を生成するサブクエリをテーブルに結合することでランダム性をシミュレートする手法が採用されています。最も効率的なアプローチではありませんが、一見ランダムな順序でデータを取得するための実用的な方法を提供します。

以上がMySQL の ORDER BY RAND() 関数は実際にランダム選択アルゴリズムを使用していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート