W MySQL, wykonanie takiego podzapytania jest "skorelowanym zapytaniem". Oznacza to, że wyniki zewnętrznego SELECT
zależy od wyniku wewnętrznego SELECT
. W rezultacie Twoje wewnętrzne zapytanie jest wykonywane raz na wiersz, co jest bardzo powolne.
Powinieneś dokonać refaktoryzacji tego zapytania; to, czy dołączysz dwa razy, czy użyjesz dwóch zapytań, jest w większości nieistotne. Dwukrotne dołączenie da ci:
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', ...)
Aby uzyskać więcej informacji, zobacz podręcznik MySQL dotyczący konwertowania podzapytań na JOIN .
Wskazówka:EXPLAIN SELECT
pokaże Ci, jak optymalizator planuje obsługę Twojego zapytania. Jeśli zobaczysz DEPENDENT SUBQUERY
powinieneś dokonać refaktoryzacji, są one bardzo wolne.