Dans MySQL, faire une sous-requête comme celle-ci est une "requête corrélée". Cela signifie que les résultats du SELECT
externe dépendent du résultat du SELECT
intérieur . Le résultat est que votre requête interne est exécutée une fois par ligne, ce qui est très lent.
Vous devez refactoriser cette requête ; que vous rejoigniez deux fois ou que vous utilisiez deux requêtes n'est généralement pas pertinent. Rejoindre deux fois vous donnerait :
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', ...)
Pour plus d'informations, consultez le manuel MySQL sur convertir les sous-requêtes en JOIN .
Conseil :EXPLAIN SELECT
vous montrera comment l'optimiseur prévoit de traiter votre requête. Si vous voyez DEPENDENT SUBQUERY
vous devriez refactoriser, ils sont méga-lents.