I MySQL är att göra en subquery som denna en "korrelerad fråga". Detta innebär att resultaten av den yttre SELECT
beror på resultatet av den inre SELECT
. Resultatet är att din inre fråga exekveras en gång per rad, vilket är mycket långsamt.
Du bör refaktorera den här frågan; om du går med två gånger eller använder två frågor är för det mesta irrelevant. Att gå med två gånger skulle ge 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', ...)
För mer information, se MySQL-manualen om att konvertera delfrågor till JOINs .
Tips:EXPLAIN SELECT
kommer att visa dig hur optimeraren planerar att hantera din fråga. Om du ser DEPENDENT SUBQUERY
du bör refaktorera, dessa är mega-långsamma.