1. ホーム
  2. sql

[解決済み] サブクエリ vs ジョイン

2022-04-25 18:23:11

質問

他社から引き継いだアプリケーションの遅い部分をリファクタリングして、サブクエリではなく内部結合を使うようにしました。

WHERE id IN (SELECT id FROM ...)

リファクタリング後のクエリは約100倍高速に実行されます。 (~50 秒から ~0.3 秒) 改善されることは予想していましたが、なぜそんなに劇的に改善されたのか説明できる人はいますか?where節で使用したカラムはすべてインデックス付きでした。SQLはwhere句のクエリを行ごとに1回ずつ実行するのか、それとも何かですか?

更新 - 結果を説明する。

違いは、quot;where id in ()"クエリの2番目の部分です - 。

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

vs 結合でインデックスされた1行。

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index

解決方法は?

相関性のあるサブクエリ(where condition)は、各行ごとに1回ずつ実行されます。非相関サブクエリ(where条件が含むクエリから独立しているもの)は、最初に一度だけ実行されます。SQLエンジンは、この区別を自動的に行います。

でも、そうだな、explainを使えば、汚い情報も教えてくれる。