ホームページ >データベース >mysql チュートリアル >ORDER BY RAND() を使用せずに MySQL から複数のランダムな行を効率的に取得するにはどうすればよいですか?

ORDER BY RAND() を使用せずに MySQL から複数のランダムな行を効率的に取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-21 03:21:10637ブラウズ

How Can I Efficiently Retrieve Multiple Random Rows from MySQL without Using ORDER BY RAND()?

MySQL: ORDER BY RAND() を超える高スループットのランダム サンプリング

複数のランダムな結果を取得するための代替手段を検討します

MySQL の ORDER BY RAND() 関数は、ランダムな結果を直接取得する方法を提供しますが、ランダム データの複数行を効率的に選択することはできません。この記事では、そのようなクエリを最適化するための代替手法を検討します。

最適化ソリューション: インデックス列とサブクエリの使用

ランダムな結果を求めるクエリの場合、パフォーマンスの最適化が重要です。効果的な革新的なアプローチの 1 つは、インデックス付き列とサブクエリを組み合わせて使用​​することです。この手法は、ランダム化プロセスを特定の条件に分離することで、処理のオーバーヘッドを大幅に削減します。

手順:

  1. ランダム化する結果のパーセンテージを決定します: ランダム化する結果の数を行の合計数のパーセンテージとして定義します。
  2. サブクエリを作成します: RAND() 関数と LIMIT 句を使用して、指定されたパーセンテージを満たす行 ID を選択します。
  3. サブクエリの結合: 結合を使用して、インデックス列を結合キーとして使用し、サブクエリをメインテーブルと結合します。
  4. 完全な結果の取得: サブクエリによって識別された行を使用して、メイン テーブルから必要な列を取得します。

例:

次のクエリを考えてみましょう:

<code class="language-sql">SELECT u.id, 
       p.photo 
FROM users u, profiles p 
WHERE p.memberid = u.id 
  AND p.photo != '' 
  AND (u.ownership=1 OR u.stamp=1) 
ORDER BY RAND() 
LIMIT 18 </code>

最適化されたクエリ:

<code class="language-sql">SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id</code>

利点:

  • 実行速度の最適化、ORDER BY RAND() よりもはるかに高速
  • 大規模なデータセットのスケーラビリティの向上
  • インデックス付き列を持つすべてのテーブルに適用されます

注:

この最適化方法は、サブクエリとメインクエリの間の一貫性に依存して、正確な結果が返されるようにします。さらに、ランダム化された結果のパーセンテージに対して適切な制限を選択すると、パフォーマンスを維持するのに役立ちます。

以上がORDER BY RAND() を使用せずに MySQL から複数のランダムな行を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。