-1

DDL ステートメントがあります。

CREATE TABLE t1(
c1 INT NOT NULL
);
CREATE TABLE t2(
c2 INT NOT NULL
);

私のクエリ:

SELECT c1 FROM t1 WHERE c1 NOT IN (SELECT c2 from t2)

EXPLAIN 出力:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY t1  ALL NULL    NULL    NULL    NULL    3   Using where
2   DEPENDENT SUBQUERY  t2  ALL NULL    NULL    NULL    NULL    3   Using where

サブクエリは外部クエリと相関しません。タイプがDEPENDENT SUBQUERYなのはなぜですか?

UPD: クエリはSELECT c1 FROM t1 WHERE c1 NOT IN (SELECT c2 from t2)

4

1 に答える 1

1

使用している MySQL バージョンの実行プランナー/オプティマイザーは、クエリを相関サブクエリとして内部的に書き換えます (より正確には、これらは両方とも同じ実行プランに変換されます)。

SELECT c1 
FROM t1 
WHERE NOT EXISTS 
      (SELECT * from t2 WHERE c2 = t1.c1) ;

このタイプのクエリはアンチジョイン(またはアンチセミジョイン) と呼ばれ、別の方法で を使用して記述することもできますLEFT JOIN / WHERE IS NULL。これにより、MySQL (5.1 および 5.5 バージョン) でわずかに異なる Explain プランが生成されます。

SELECT t1.c1 
FROM t1 
  LEFT JOIN t2 ON t2.c2 = t1.c1
WHERE t2.c2 IS NULL ;

5.6 (まだ開発中) や MariaDB (最近のバージョンではオプティマイザが改善されています) などの他のバージョンでは、クエリが異なる方法で書き直される可能性があることに注意してください。

同じバージョンであっても、同じクエリ (および特に複雑なクエリ) の最終的な実行計画は、使用可能なインデックス、テーブルのサイズ、およびその他のいくつかの要因によって、実行ごとに異なる場合があります。

于 2012-10-31T20:37:50.727 に答える