I MySQL er det at lave en underforespørgsel som denne en "korreleret forespørgsel". Dette betyder, at resultaterne af den ydre SELECT
afhænge af resultatet af den indre SELECT
. Resultatet er, at din indre forespørgsel udføres én gang pr. række, hvilket er meget langsomt.
Du bør refaktorisere denne forespørgsel; om du deltager to gange eller bruger to forespørgsler er for det meste irrelevant. At deltage to gange ville give dig:
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', ...)
For mere information, se MySQL-manualen om konvertering af underforespørgsler til JOINs .
Tip:EXPLAIN SELECT
vil vise dig, hvordan optimeringsværktøjet planlægger at håndtere din forespørgsel. Hvis du ser DEPENDENT SUBQUERY
du bør revactor, disse er mega-langsomme.