持つトラブルを引き起こす、行の千返します。サブクエリは、次のようにサブクエリを作る遅い
SELECT ser_id FROM history WHERE his_status=2
それはわずか0.5秒で動作します。私は、サブクエリを実行する場合
。 このサブクエリには50,000件のレコードがあります。
これを最適化する方法はありますか?ありがとうございました。
持つトラブルを引き起こす、行の千返します。サブクエリは、次のようにサブクエリを作る遅い
SELECT ser_id FROM history WHERE his_status=2
それはわずか0.5秒で動作します。私は、サブクエリを実行する場合
。 このサブクエリには50,000件のレコードがあります。
これを最適化する方法はありますか?ありがとうございました。
代わりに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
計画を試してみてください。行の「大規模な」量を扱うが、サブクエリ自体の中に選んだとき、これはあなたのクエリをスピードアップする必要があります。
まず、インデックスを作成する必要があります。
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);
を比較します。おそらく '存在しない'か '外部結合/ヌル'はより速いでしょう - 一般に、パフォーマンス関連の質問では、それは単に依存しています。 – sgeddes