私は自分のサーバー上で実行されるクエリを持っています。NOT IN()を使用したクエリの効率?
DELETE FROM pairing WHERE id NOT IN (SELECT f.id FROM info f)
そのペアリングのid
がinfo
でないときそれはpairing
からすべてのエントリを2つの異なるテーブル、pairing
を取り、info
とDELETE
に述べています。
これは実行に時間がかかりすぎるサーバーで問題が発生しました。これは効率(またはSELECT
ステートメントの制約がない)と関係していると思います。
しかし、私はMySQL slow_log
を見ましたが、比較されるエントリの数は実際にはLOWERである必要があります。私の理解から、これはO(mn)時間であるべきです。ここで、mはpairing
のエントリの数であり、nはinfo
のエントリの数です。 pairing
のエントリ数は26,868、info
のエントリ数は34,976です。
これは、939,735,168回の比較を追加します。しかし、slow_log
にはわずか543,916,401しかないと言われています。
私は、この特定のクエリの効率がどのように作用するかを私に説明してもらえないかと考えていました。私はそれがこの場合の祝福であるべきだと思うより速く実行しているという事実を理解していますが、私はそれをさらに改善できるように最適化がどこから来るのかを理解する必要があります。
また、EXPLAIN(またはOracleを使用している場合はEXPLAIN PLAN)を使用して、データベースサーバーによって実行されていることを正確に確認することもできます。 – Woody
そのキーワードの正確な使い方を教えてください。 – Jodo1992
あなたはMysqlを使用していると仮定します: EXPLAIN SELECT id FROMペアリングWHERE id NOT IN(SELECT f.id FROM info f) – Woody