У меня есть вопрос по оптимизации здесь.
Фон
У меня 12000 пользователей в пользовательской таблице, по записи на пользователя. Каждый пользователь может быть в нуле или более групп. У меня есть таблица групп с 45 группами и таблица groups_link с 75000 записями (чтобы облегчить отношения многие ко многим).
Я делаю экран запросов, который позволяет пользователю отфильтровывать пользователей из списка пользователей.
Aim
В частности, мне нужна помощь: Выбор всех пользователей, которые входят в одну группу, но не находятся в другой группе.
Структура БД
Запрос
Мой текущий запрос, который выполняется слишком медленно ...
SELECT U.user_id,U.user_email
FROM (sc_module_users AS U)
JOIN sc_module_users_groups_links AS group_join ON group_join.user_id = U.user_id
LEFT JOIN sc_module_users_groups_links AS excluded_group_join ON group_join.user_id = U.user_id
WHERE group_join.group_id IN (27) AND excluded_group_join.group_id NOT IN (19) OR excluded_group_join.group_id IS NULL AND U.user_subscribed=1 AND U.user_active=1
GROUP BY U.user_id,U.user_id
Этот запрос занимает 9 минут, он возвращает 11 000 записей (из 12 000).
Объясните
Вот объяснение этого запроса:
Нажмите здесь, чтобы ближе посмотреть
Может кто-нибудь помочь мне оптимизировать это до отметки ниже 1 минуты ...?
После 3 ревизий я изменил это на
SELECT U.user_id,U.user_email FROM (sc_module_users AS U) WHERE ( user_country LIKE '%australia%' ) AND
EXISTS (SELECT group_id FROM sc_module_users_groups_links l WHERE group_id in (31) AND l.user_id=U.user_id) AND
NOT EXISTS (SELECT group_id FROM sc_module_users_groups_links l WHERE group_id in (27) AND l.user_id=U.user_id)
AND U.user_subscribed=1 AND U.user_active=1 GROUP BY U.user_id
намного быстрее