In MySQL ist eine solche Unterabfrage eine "korrelierte Abfrage". Das bedeutet, dass die Ergebnisse des äußeren SELECT
hängen vom Ergebnis des inneren SELECT
ab . Das Ergebnis ist, dass Ihre innere Abfrage einmal pro Zeile ausgeführt wird, was sehr langsam ist.
Sie sollten diese Abfrage umgestalten; ob Sie zweimal beitreten oder zwei Abfragen verwenden, ist meistens irrelevant. Wenn Sie zweimal beitreten, erhalten Sie:
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', ...)
Weitere Informationen finden Sie im MySQL-Handbuch zum Konvertieren von Unterabfragen in JOINs .
Tipp:EXPLAIN SELECT
zeigt Ihnen, wie der Optimierer Ihre Abfrage handhaben will. Wenn Sie DEPENDENT SUBQUERY
sehen Sie sollten umgestalten, diese sind mega-langsam.