他の会社から継承したアプリケーションの遅いセクションを、次のようなサブクエリの代わりに内部結合を使用するようにリファクタリングしました。
WHERE id IN (SELECT id FROM ...)
リファクタリングされたクエリは約 100 倍高速に実行されます。(約 50 秒から約 0.3 秒) 改善されると思っていましたが、なぜこれほど劇的なのか説明できる人はいますか? where 句で使用されている列はすべてインデックス化されていました。SQL は where 句のクエリを行ごとに 1 回実行するのでしょうか?
アップデート- 結果を説明します:
違いは、「where id in ()」クエリの2番目の部分にあります。
2 DEPENDENT SUBQUERY submission_tags ref st_tag_id st_tag_id 4 const 2966 Using where
結合された 1 つのインデックス行と比較:
SIMPLE s eq_ref PRIMARY PRIMARY 4 newsladder_production.st.submission_id 1 Using index
ベストアンサー1
「相関サブクエリ」(つまり、where 条件が包含クエリの行から取得された値に依存するサブクエリ) は、各行に対して 1 回実行されます。非相関サブクエリ (where 条件が包含クエリから独立しているサブクエリ) は、最初に 1 回実行されます。SQL エンジンは、この区別を自動的に行います。
しかし、そうですね、explain-plan は、汚い詳細を教えてくれます。