2011-02-04 10 views
0

実行に非常に長い時間がかかっています(15秒など)、これは小さなテストデータセット上にしか存在しません。特定のMySQLクエリを改善してCPU /ディスクの負荷を軽減する

私はこれを改善する助けを探しています:

describe SELECT * from people where uid in (SELECT uid2 from friends where uid1=PHP_UID_VARIABLE) order by rand() limit 1; 
+----+--------------------+---------+------+---------------+------+---------+-------+-------+----------------------------------------------+ 
| id | select_type  | table | type | possible_keys | key | key_len | ref | rows | Extra          | 
+----+--------------------+---------+------+---------------+------+---------+-------+-------+----------------------------------------------+ 
| 1 | PRIMARY   | people | ALL | NULL   | NULL | NULL | NULL | 6726 | Using where; Using temporary; Using filesort | 
| 2 | DEPENDENT SUBQUERY | friends | ref | uid1,uid2  | uid1 | 8  | const | 15501 | Using where         | 
+----+--------------------+---------+------+---------------+------+---------+-------+-------+----------------------------------------------+ 

私はそれが「悪い」というのWHERE知っている - それがAに参加し、特に効率的になるだろうことはありませんランド()によって順序の両方をやっています。なぜ "人"テーブルのインデックスを使用していないのか分かりません。 "uid"は主キーであり、索引付けされています。

クエリの目的は十分に明らかにする必要がありますが、後世のために、私はuidが別のテーブルの "friends"リストと一致する人のテーブルからランダムな行を1つ選択します。

答えて

3

は、私は生産の句で使用しないでください。この

SELECT p.* 
FROM friends AS f 
LEFT JOIN people AS p ON f.uid2 = p.uid 
WHERE f.uid1=PHP_UID_VARIABLE 
ORDER BY RAND() 
LIMIT 1 
+0

優れています。うまくいきます。ここで私のオリジナルよりも効率的なクエリを書く方法が分かります: –

+0

@Rafiq - この回答の投票総数の下にあるチェックボックスを忘れないようにしてください。これは、この答えを正しいものとして選択し、回答者にポイントを報酬として与えます。 :) –

+0

私はStackOverflow 'Accept Timer'がなくなるのを待っています: –

0

を試してみてください。

は、 または ではない今

をEXISTS EXISTS一部の人々は、それは問題ではないと言います。問題があると言う人もいます。 実験は真の決定方法です。ここで

は、MySQLのドキュメントです:

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

私のアドバイスは、書き込みがEXISTSおよびNOT EXISTS句、および牧草地に出て「IN」句を貼り付け方法(「それについて考えなし」)を学ぶことです(データの時々のクイックルックアップを除く)。

しかし、プロダクションクエリでは、 "IN"をダンプすると思います。

関連する問題