In MySQL, eseguire una sottoquery come questa è una "query correlata". Ciò significa che i risultati dell'esterno SELECT
dipendono dal risultato del SELECT
interno . Il risultato è che la tua query interna viene eseguita una volta per riga, il che è molto lento.
Dovresti rifattorizzare questa query; se ti unisci due volte o usi due query è per lo più irrilevante. Partecipare due volte ti darebbe:
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', ...)
Per ulteriori informazioni, vedere il manuale MySQL su conversione di subquery in JOIN .
Suggerimento:EXPLAIN SELECT
ti mostrerà come l'ottimizzatore prevede di gestire la tua query. Se vedi DEPENDENT SUBQUERY
dovresti refactoring, questi sono molto lenti.