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

「ORDER BY RAND()」を使用せずにデータベースから複数のランダムな結果を効率的に取得するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-21 03:36:08276ブラウズ

How Can I Efficiently Retrieve Multiple Random Results from a Database without Using `ORDER BY RAND()`?

MySQL でのランダムなデータ取得によるパフォーマンスのボトルネックの回避

MySQL の ORDER BY RAND() は、ランダムなデータベース エントリを取得する簡単な方法です。 ただし、この方法を使用して複数のランダム行を取得すると、特に大規模なデータセットの場合、非常に遅くなります。

18 個のランダムなユーザー プロファイルを選択することを目的とした次のクエリについて考えてみましょう。

<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>

この非効率性は、ORDER BY RAND() 句を適用する前に結果セット全体をソートするという LIMIT の本質的な必要性から生じています。

より効率的なアプローチ

優れた戦略では、インデックス付き列を利用してランダム選択を劇的に高速化します。 最適化されたクエリは次のとおりです:

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

最適化の説明

この改訂されたクエリには、いくつかの重要な改善が組み込まれています。

  • インデックス付き列の使用率: サブクエリは、合計行の割合に対して RAND() を使用して行をフィルター処理します。 id 列 (または WHERE 句で使用される列) にインデックスを付けると、行を迅速に識別できるようになります。
  • ランダム化 ID のみ: ランダム化は ID にのみ適用され、メモリ使用量が最小限に抑えられ、パフォーマンスが向上します。
  • 一貫性の制限: サブクエリ (4) とクエリ全体の LIMIT 句は同一である必要があります。
  • 洗練されたサブクエリ: サブクエリにはメイン クエリと同じ WHERE 条件が組み込まれており、データの整合性が保証されます。

この方法では、大規模なテーブルであってもクエリの実行時間が大幅に短縮され、複数のランダムな結果を取得するためのよりスケーラブルなソリューションが提供されます。

結論

これらの最適化手法は、MySQL でランダムなデータ選択を処理する際のパフォーマンスを大幅に向上させます。 ORDER BY RAND() を回避すると、より効率的で堅牢なデータベース アプリケーションを作成できます。

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

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