MySQLでは、このようなサブクエリを実行することは「相関クエリ」です。これは、外側のSELECT
の結果を意味します 内部のSELECT
の結果に依存します 。その結果、内部クエリは行ごとに1回実行されますが、これは非常に低速です。
このクエリをリファクタリングする必要があります。 2回参加するか、2つのクエリを使用するかは、ほとんど関係ありません。 2回参加すると、次のようになります。
SELECT something
FROM posts
INNER JOIN tag_map ON tag_map.id = posts.id
INNER JOIN tags ON tags.tag_id = tag_map.tag_id
WHERE tags.tag IN ('tag1', ...)
詳細については、サブクエリのJOINへの変換に関するMySQLマニュアルを参照してください。 。
ヒント:EXPLAIN SELECT
オプティマイザがクエリの処理をどのように計画しているかを示します。 DEPENDENT SUBQUERY
が表示された場合 リファクタリングする必要があります。これらは非常に遅いです。