Внутреннее соединение на 1 = 1
является замаскированным перекрестным соединением, и число строк, создаваемых перекрестным соединением, может быстро расти. Это произведение количества строк в обоих отношениях. Для производительности вы хотите, чтобы промежуточные результаты были как можно меньше.
Тогда вместо IN
EXISTS
часто работает лучше, когда количество строк в подзапросе велико.
Но я думаю, что вам вообще не нужны IN
или EXITS
.
Предполагая, что unique_id
идентифицирует запись и не является нулевым, вы можете присоединить первую таблицу ко второй на общих unique_id
s. Тогда тогда и только тогда, когда ни одна запись для unique_id
во второй таблице не выйдет из unique_id
первой таблицы в результате объединения, будет нулевым, так что вы можете проверить это.
SELECT b.fedvip_active,
b.unique_id,
b.first_name,
b.email_primary
FROM master_subscribers_prospects_2 b
LEFT JOIN master_subscribers_prospects_1 a
ON b.unique_id = a.unique_id
WHERE a.fedvip_active = 1
AND b.fedvip_active = 0
OR a.unique_id IS NULL
AND b.fedvip_active = 1;
Для этого индексы запросов на master_subscribers_prospects_1 (unique_id, fedvip_active)
и master_subscribers_prospects_2 (unique_id, fedvip_active)
также могут помочь ускорить процесс.