MySQL の ORDER BY RAND() を理解する
ORDER BY RAND() 構文は単純そうに見えますが、その内部動作は謎めいている場合があります。この記事では、この操作の背後にある仕組みを詳しく掘り下げ、予期せぬパフォーマンスの矛盾をいくつか取り上げます。
ORDER BY RAND() の機能
当初、ORDER BY RAND は次のように考えられていました。 () はランダムな値の列をテーブルに追加し、それに基づいて並べ替えました。ただし、その後の調査により、Jay が提案したメソッドの方が大幅に高速であることが明らかになりました。
SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;
このメソッドは、既存の ID の範囲内でランダムな ID を生成し、最初に一致する行を取得します。
パフォーマンスの変動
興味深いことに、ORDER BY RAND() のパフォーマンスは、結果に含まれる列に基づいて異なります。
SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 seconds*/ SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 seconds*/ SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 seconds*/
この矛盾はインデックス作成に起因すると考えられます。 id 列にはインデックスが付けられているため、検索が高速になります。結果にユーザー名を追加するには、各行からユーザー名を読み取る必要があるため、操作が遅くなります。 * の場合、可変長の列を含むすべての列をメモリにロードする必要があり、パフォーマンスにさらに影響します。
高速ランダム選択の代替手段
の場合効率的なランダム行選択を行うには、次の代替案を検討してください。
SELECT id FROM table ORDER BY RAND() LIMIT 1; SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;
以上がMySQL で ORDER BY RAND() はどのように動作するのか、またなぜ非常に遅いのか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。