2016-10-02 9 views
1

持つトラブルを引き起こす、行の千返します。サブクエリは、次のようにサブクエリを作る遅い

SELECT ser_id FROM history WHERE his_status=2 

それはわずか0.5秒で動作します。私は、サブクエリを実行する場合

。 このサブクエリには50,000件のレコードがあります。

これを最適化する方法はありますか?ありがとうございました。

+2

を比較します。おそらく '存在しない'か '外部結合/ヌル'はより速いでしょう - 一般に、パフォーマンス関連の質問では、それは単に依存しています。 – sgeddes

答えて

2

代わりにNOT EXISTSをお試しください。

SELECT s.ser_id 
FROM service s 
WHERE NOT EXISTS (
    SELECT 1 
    FROM history h 
    WHERE h.his_status = 2 
    AND h.ser_id = s.ser_id 
) 

は本当の違いを見るためにけれどもEXPLAIN計画を試してみてください。行の「大規模な」量を扱うが、サブクエリ自体の中に選んだとき、これはあなたのクエリをスピードアップする必要があります。

0

まず、インデックスを作成する必要があります。

CREATE INDEX ser_id__index ON service (ser_id); 
CREATE INDEX his_status__index ON history (his_status); 

は、次に、これらの2 SQL `ser_id`と` his_status`に索引が役立つだろう持っ

まず

SELECT ser_id FROM service 
WHERE ser_id NOT IN 
    (SELECT ser_id FROM history WHERE his_status=2); 

セカンド

SELECT ser_id FROM service 
WHERE ser_id NOT IN 
    (SELECT DISTINCT ser_id FROM history WHERE his_status=2);  
関連する問題