2011-07-06 15 views
4

私は多くのウェブサイトがORDER BY RAND()を使わないと言っていました。例えばhttp://forge.mysql.com/wiki/Top10SQLPerformanceTipsです。テストを実行して、20kレコードテーブルでスピードとパフォーマンスをテストしたところ、10kレコードにusername = "username"が入ります:なぜmysql ORDER BY RAND()を使用しないのですか?

SELECT username FROM testingspeed WHERE username='username' ORDER BY RAND(); 

結果:

Showing rows 0 - 29 (10,000 total, Query took 0.0119 sec). 
id = 1 
select_type = SIMPLE 
table = testingspeed 
type = ref 
posible_keys = username 
key = username 
key_len = 32 
ref = const 
rows = 3225 
Extra = Using where; Using index; Using temporary; Using filesort 

それだけでクエリを実行するために0.0119秒かかったので、人々はまだRAND(BY ORDERを使用していないと言う理由、それは)、非常に良いスピードすべきですか?なぜ3225行が影響を受けるのですか?なぜ10,000行も影響を受けませんか?

+0

原因を取り除き、10M行を追加してもう一度やり直してください。どのようにORDER BY RAND()の方がより遅いかを示します。 –

+0

ランダムな順序で大量のレコードを取得することはめったにありません。あなたは 'ORDER BY RAND()LIMIT 10'と言っています。これらの種類の検索でテストし、他のソリューションと比較してください。 –

+0

PHPのRAND()で検索して多数の参照を見つけました.RAND()を使用しないようにするには、本当に多くの苦情がなくなる前に、より小さいクエリの場合を除き、本番ではWHERE gender = 'male' AND location = 'antarctica'ユーザからのSELECTユーザ名 – Ryan

答えて

5

ORDER BY RAND()の問題は、あなたの説明があなたに「一時的な使用」と「ファイルの使用」を教えてくれることです。各要求に対して、一時テーブルが作成され、ソートされます。それはかなり重い操作なのです。データベースに負荷がかかっていないときはおそらく重要ではありませんが、多くのパフォーマンスが必要になります。

+0

"データベースに負荷がかかっていないとき"つまり、10kユーザーが私のWebサイトでアクティブになっている場合、データベースは負荷が重いと考えられますか?したがって、ORDER BY RAND()はその瞬間に問題を引き起こすでしょうか?その瞬間にどんな問題が起こるのか分かりますか? – zac1987

+0

私が "SELECT id、COUNT(*)FROM testingspeed"を問い合わせると、 "Using temporary"と説明されず、 "Using filesort"とは言わなかった。だから私はすべてのidsをPHP配列に保存するためにクエリを使用する場合は、PHPのランダムにPHPの配列から15 idsを選択し、それは問題を解決する必要がありますか? – zac1987

+0

それは別の方法で問題を解決するのも間違いありません。しかし、ユーザープロセスごとにメモリに完全な配列を保持する代わりに、固定されたセットを1つのプロセスで事前計算してキャッシュされたものを提供する方がよいでしょう。 – fyr

関連する問題