54

同じ主キーを持つ 2 つのテーブル (A と B) があります。BではなくAにあるすべての行を選択したい.次の作品:

select * from A where not exists (select * from B where A.pk=B.pk);

ただし、かなり悪いようです(Aの100k行のみで約2秒、Bの3〜10k未満)

これを実行するより良い方法はありますか?おそらく左結合として?

select * from A left join B on A.x=B.y where B.y is null;

私のデータでは、これはわずかに速く (~10%) 実行されるようですが、一般的にはどうでしょうか?

4

5 に答える 5

58

私はあなたの最後の声明が最善の方法だと思います。あなたも試すことができます

SELECT A.*    
from A left join B on 
    A.x = B.y
    where B.y is null
于 2008-12-09T20:09:52.587 に答える
35

2 番目の例の形式でクエリを使用します。結合は通常、相関サブクエリよりもスケーラブルです。

于 2008-12-09T20:47:39.530 に答える
2

結合は一般に (MySQL の場合) 高速ですが、まだ動きが遅い場合は、インデックス スキームも検討する必要があります。通常、(INNODB を使用して) 外部キーとして設定されたフィールドには、既にインデックスが設定されています。MYISAM を使用している場合は、ON ステートメントのすべての列がインデックス化されていることを確認し、WHERE 句の列をインデックスの末尾に追加して、それをカバリング インデックスにすることも検討してください。これにより、エンジンはインデックスに必要なすべてのデータにアクセスできるようになり、元のデータへの 2 回目のラウンドトリップを行う必要がなくなります。これは挿入/更新/削除の速度に影響を与えますが、クエリの速度を大幅に向上させることができることに注意してください。

于 2010-09-28T21:58:20.243 に答える
2

また、「table2.id が null の場合」タイプの条件で左結合を使用します。

確かに、ネストされたクエリ オプションよりも効率的であるようです。

于 2009-05-27T14:52:17.600 に答える
-2

これは私を大いに助けました。Joinsサブクエリよりも常に高速で結果が得られます。

SELECT tbl1.id FROM tbl1 t1
LEFT OUTER JOIN tbl2 t2 ON t1.id = t2.id 
WHERE t1.id>=100 AND t2.id IS NULL ;
于 2015-12-14T10:25:24.850 に答える