非常に多くの行(たとえば、3億行)のSQLテーブルを想像してみてください。
各行にはテキストフィールドがあり、ランダムに10行を取得したいと思います。
問題は、
select key from the_table where enabled=1 order by rand() limit 10
rand値を計算し、その値ですべての行を並べ替えるのは非常に負荷が高くなります。
それを回避する方法はありますか?
SQLの外部でキーを生成できる場合(有効になっている10を取得するのに15〜20を使用する場合でも)、order()をスキップできます。これは、ほぼ確実に、ロードする際の問題です。
SELECTキーWHEREキーIN[x、y、z ....]
ここで、x、y、zはランダムに外部で生成されます。
さらに良いことに、有効なキーのテーブルを作成し、ランダムに並べ替えて、10個のチャンクでページをめくることができます。時々更新する必要があり、スペースにペナルティがありますが、それほど大きな問題ではないでしょう。
より洗練されたソリューションがありますが、それはあなたを動かすでしょう。
考えられる解決策を(時間)テストして、実際にあなたが思うほど遅いことを確認します。
主キーがシーケンシャルであるか、そうでなければ予測可能である場合、おそらくコードから、またはプロシージャの一部として10個のランダムなキーを生成し、次にキーごとSELECT
に10個のレコードを生成できます。
たとえば、キーが連続した数値IDである場合、とRAND
の間Min(ID)
で10個の数値を生成しMax(ID)
、WHERE Id in (rand1, rand2, rand3 ...)