2

非常に多くの行(たとえば、3億行)のSQLテーブルを想像してみてください。

各行にはテキストフィールドがあり、ランダムに10行を取得したいと思います。

問題は、

select key from the_table where enabled=1 order by rand() limit 10

rand値を計算し、その値ですべての行を並べ替えるのは非常に負荷が高くなります。

それを回避する方法はありますか?

4

2 に答える 2

1

SQLの外部でキーを生成できる場合(有効になっている10を取得するのに15〜20を使用する場合でも)、order()をスキップできます。これは、ほぼ確実に、ロードする際の問題です。

SELECTキーWHEREキーIN[x、y、z ....]

ここで、x、y、zはランダムに外部で生成されます。

さらに良いことに、有効なキーのテーブルを作成し、ランダムに並べ替えて、10個のチャンクでページをめくることができます。時々更新する必要があり、スペースにペナルティがありますが、それほど大きな問題ではないでしょう。

より洗練されたソリューションがありますが、それはあなたを動かすでしょう。

于 2012-06-01T15:49:23.620 に答える
1

考えられる解決策を(時間)テストして、実際にあなたが思うほど遅いことを確認します。

主キーがシーケンシャルであるか、そうでなければ予測可能である場合、おそらくコードから、またはプロシージャの一部として10個のランダムなキーを生成し、次にキーごとSELECTに10個のレコードを生成できます。

たとえば、キーが連続した数値IDである場合、とRANDの間Min(ID)で10個の数値を生成しMax(ID)WHERE Id in (rand1, rand2, rand3 ...)

于 2012-06-01T15:50:54.417 に答える