No MySQL, fazer uma subconsulta como essa é uma "consulta correlacionada". Isso significa que os resultados do
SELECT
externo dependem do resultado do SELECT
interno . O resultado é que sua consulta interna é executada uma vez por linha, o que é muito lento. Você deve refatorar essa consulta; se você junta duas vezes ou usa duas consultas é irrelevante. Juntar-se duas vezes lhe daria:
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', ...)
Para obter mais informações, consulte o manual do MySQL sobre conversão de subconsultas em JOINs .
Dica:
EXPLAIN SELECT
mostrará como o otimizador planeja lidar com sua consulta. Se você vir DEPENDENT SUBQUERY
você deve refatorar, eles são mega lentos.