2012-03-13 11 views
0

現在、私は私のPHPスクリプトでこのクエリを使用しています:選択した行を(本当に)ランダムに並べ替える方法は?

SELECT * FROM `ebooks` WHERE `id`!=$ebook[id] ORDER BY RAND() LIMIT 125; 

データベースには、最大で大きな約2500行になりますが、私はORDER BY RAND()が最終的にデータとして処理時間が遅くなることを読みましたデータベースが大きくなります。

だから私は物事をスムーズに実行するために私のクエリのための代替の方法を探しています。

また、ORDER BY RAND()は本当に行をランダム化していないことに気付きました。これは、しばしば何度も何度も何度も繰り返すパターンに従うことが多いためです。

本当に行をランダム化する方法はありますか?

+3

'ORDER)'ない 'RAND()'自体、遅くなります。 – hakre

+2

AFAIKは、PHP側のランダム化を行う最良の方法です。例えば、あなたのIDが一貫しているなら、あなたは単にMySQLからカウント(*)を得て、idのいくつかをランダムに選ぶことができます。 – Robus

+3

見てみましょうhttp://stackoverflow.com/questions/1823306/mysql-alternatives-to-order-by-rand – a1ex07

答えて

1

RAND()機能は、擬似乱数生成器であり、あなたが異なる値で初期化していない場合は、あなたに同じ数列を与えるので、あなたは何をすべきかです:

SELECT * FROM `ebooks` WHERE `id`!=$ebook[id] ORDER BY RAND(UNIX_TIMESTAMP()) LIMIT 125; 

シードれます現時点の乱数発生器を使用して、異なる一連の数値を返します。それはそれでソートその後、乱数を毎回生成しなければならないため

RAND()SELECTORDER BY句が遅くなります。データを呼び出し元のプログラムに戻し、array_randのようなものを使用してデータをランダム化することをお勧めします。

+2

しかし、unix_timestampは1秒の細かさを持っているので、各クエリの実行間隔は1秒です。 –

+1

これは、クエリにハードコードされた何か他の値を提供するか、秒に固執することにつながる可能性があります。これは実際には、使用分野に応じて役に立つクエリをキャッシュ可能にします。 – hakre

+1

@MarcB私はこの問題に対する単純なアプローチを提供しました。確かに 'gettimeofday'を使ってエポックからのマイクロ秒数を計算し、それを使用しますが、同じセッションに1秒間に複数のランダムなセットを返す必要がある場合は、毎回クエリを呼び出すのではなく、キャッシュされたデータセットで行います。 – Karlson

関連する問題