2011-08-12 8 views
1
select docid from A where docid IN (select distinct(docid) from B) 

それはデータのサイズごとに長すぎる秒を取ります。MySQLは

以下は両方のテーブルの詳細です。

Table A : 
    | docid  | int(11) | NO | PRI | NULL |  | 
    Total number of entries = 500 (all entries are unique) 

    Table B: 
    | docid  | int(11) | YES |  | NULL |  | 
    Total number of entries = 66508 
    (number of unique entries are 500) 

    mysql version : 5.2 

私だけselect docid from Aを実行するとselect docid from Bは0.07秒を取っている間、それは0.00秒、 かかります。

なぜサブクエリを使用するINクエリが33秒かかるのですか?私は何か間違っているのですか?

+0

このクエリで何を達成したいですか? – Sleeperson

+0

私はこのクエリが1秒で実行されるはずです。なぜこれは時間がかかりすぎるのですか? – Kunal

+0

'desc select docid from A docid IN(Bからselect distinct(docid));'オーバーヘッドは、入力する必要のある 'IN()'と一致するようにスキャンする必要があるためです。 – ajreal

答えて

4

MySQLはIN(サブクエリ)をうまく処理しません。結果を「記憶」するのではなく、外側のクエリが評価されるたびに内側のクエリが実行されます。

したがって、参加を行う方がはるかに良いです。

他のRDBMSではこのbtwを実行しません。

+0

を参照してください。ブライアンに感謝します。 – Kunal

6

INリストは非常に大きく、60Kエントリです。

select A.docid -- edited - I left out the A. :(
from A 
join B on B.docid = A.docid; 

これは非常に迅速に実行され、 "IN"クエリと同じ結果が得られます。

+0

'select docid'のようなエイリアスは' select A.docid'のようになります – ajreal

+0

Bohenian、私はその質問でdistinctを使用していたので私は自分の質問を編集しました。私が "Bからselect distinct(docid)"を実行すると、0.07秒しかかかりません。なぜINクエリで33秒かかるのですか? – Kunal

+0

...別のクエリでは主キーインデックスを使用して一致する行を検索できますが、サブクエリはBのサブクエリに一致するすべての行がAと一致する「forループ」のように実行される可能性があるため、現時点ではMySQLで最適化されています。 http://technocation.org/content/oursql-episode-29%3A-subpar-subqueriesとMySQLマニュアルhttp://dev.mysql.com/doc/refman/5.5/en/optimizing-subqueries.html – eimaj