2011-01-19 9 views
2

でちょうどランド()を使用するよりも速く参加し使用していることはどのようにがどのようにMySQLの

SELECT * FROM `table` ORDER BY RAND() LIMIT 1 

私が実際にトラブル最初の理解を持っていますより

SELECT t.id 
FROM table t 
JOIN (SELECT(FLOOR(max(id) * rand())) AS maxid FROM table) 
AS tt 
ON t.id >= tt.maxid 
LIMIT 1 

高速です。たぶん、私がなぜ他のものより速いのか分かっていれば、私はより良い理解を得るでしょう。

あなたがクエリにEXPLAIN使用しますが、基本的にはできDifficult MySQL self-join please explain

答えて

6

@ *オリジナルのポスト:最初のあなたはに基づいて、(非常に遅いではありません)乱数を取得しているでは

にa(i推定)のインデックス付きフィールドの最大値。これはかなり速いです、私は多分ほぼ一定の時間(インデックスハッシュの実装に依存していますか?)と言うでしょう。

あなたはその数に加わり、最初の行だけを返しますもう一度インデックスを使用していますが、これは素早く稲妻です。

第2のものは、あるランダム関数によって順序付けされています。これはする必要がありますが、そのための説明を見て、FULL TABLEスキャンを行い、最初のものを返す必要があります。これは非常に高価です。あなたはそのランドのためにインデックスを使用していません。

(説明あなたは、キーを使用していないことを示し、次のようになります)

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE table ALL NULL NULL NULL NULL 14 Using temporary; Using filesort 
+0

ありがとう! (私はMySQLコマンドの時間コストの要約をどこで見つけることができるか知っていますか?) – whamsicore

+0

私はその情報も可能ではないと思います。 "EXPLAIN"コマンドと構文をチェックしてください。コマンドのコストは、システムがチェックする必要があるかどうかによって異なります。あなたがインデックスを持っていれば、それは速いです、あなたは完全なテーブルスキャンを行う必要がある場合、それは遅いです。まず、索引、結合(索引付き)および副問合せ/一時表を読んでください。次に、test-dbとEXPLAINコマンドで遊んでください。 – Nanne

関連する問題