真にランダムなレコードを取得するのは遅くなる可能性があります。この事実を回避することはあまりありません。真にランダムにしたい場合は、クエリがどのレコードから選択する必要があるかを知るために、関連するすべてのデータをロードする必要があります。
幸いなことに、それを行うためのより迅速な方法があります。それらは適切にランダムではありませんが、速度と少し純粋なランダム性を交換することに満足している場合は、ほとんどの目的に十分なはずです。
そのことを念頭に置いて、「ランダム」レコードを取得する最も速い方法は、ランダムな値が入力された列をDBに追加することです。おそらく、主キーのソルトされたMD5ハッシュですか?なんでもいい。この列に適切なインデックスを追加してから、列をORDER BY
に追加するだけです。 クエリに句を含めると、ランダムな順序でレコードが返されます。
単一のランダムレコードを取得するには、LIMIT 1
を指定するだけです。 WHERE random_field > $random_value
を追加します ここで、ランダム値は新しいフィールドの範囲内の値になります(たとえば、乱数のMD5ハッシュなど)。
もちろん、ここでの欠点は、レコードがランダムな順序になりますが、同じランダムな順序でスタックすることです。私はそれがクエリ速度と完璧を交換していると言った。定期的に新しい値で更新することでこれを回避できますが、新しい値を維持する必要がある場合は、問題になる可能性があります。
もう1つの欠点は、列を追加するのは、ストレージの制約があり、DBのサイズがすでに大きいかどうか、または列を追加する前に通過する厳密なDBAがあるかどうかを尋ねるには多すぎる可能性があることです。しかし、繰り返しになりますが、何かをトレードオフする必要があります。クエリ速度が必要な場合は、この追加の列が必要です。
とにかく、それがお役に立てば幸いです。