ホームページ >データベース >mysql チュートリアル >「ORDER BY RAND()」を使用せずにデータベースから複数のランダムな結果を効率的に取得するにはどうすればよいですか?
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
句で使用される列) にインデックスを付けると、行を迅速に識別できるようになります。LIMIT
句は同一である必要があります。WHERE
条件が組み込まれており、データの整合性が保証されます。この方法では、大規模なテーブルであってもクエリの実行時間が大幅に短縮され、複数のランダムな結果を取得するためのよりスケーラブルなソリューションが提供されます。
結論
これらの最適化手法は、MySQL でランダムなデータ選択を処理する際のパフォーマンスを大幅に向上させます。 ORDER BY RAND()
を回避すると、より効率的で堅牢なデータベース アプリケーションを作成できます。
以上が「ORDER BY RAND()」を使用せずにデータベースから複数のランダムな結果を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。