В MySQL извършването на подзаявка като тази е „корелирана заявка“. Това означава, че резултатите от външния SELECT
зависят от резултата на вътрешния SELECT
. Резултатът е, че вашата вътрешна заявка се изпълнява веднъж на ред, което е много бавно.
Трябва да преработите тази заявка; дали ще се присъедините два пъти или ще използвате две заявки е почти без значение. Присъединяването два пъти ще ви даде:
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', ...)
За повече информация вижте ръководството на MySQL за конвертиране на подзаявки в JOIN .
Съвет:EXPLAIN SELECT
ще ви покаже как оптимизаторът планира да обработи вашето запитване. Ако видите DEPENDENT SUBQUERY
трябва да преработите, те са мега-бавни.