En MySQL, hacer una subconsulta como esta es una "consulta correlacionada". Esto significa que los resultados del SELECT
externo dependen del resultado del SELECT
interno . El resultado es que su consulta interna se ejecuta una vez por fila, lo cual es muy lento.
Debe refactorizar esta consulta; ya sea que se una dos veces o use dos consultas, es en su mayoría irrelevante. Unirse dos veces le daría:
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 obtener más información, consulte el manual de MySQL sobre conversión de subconsultas a JOIN .
Sugerencia:EXPLAIN SELECT
le mostrará cómo el optimizador planea manejar su consulta. Si ve DEPENDENT SUBQUERY
deberías refactorizar, estos son mega-lentos.