У меня есть 2 таблицы, users
и sessions
. Таблицы выглядят так:
пользователи - id
(int), name
(varchar)
сеансов - id
(int), user_id
(int), ip
(inet), cookie_identifier
(varchar)
Все столбцы имеют индекс.
Теперь я пытаюсь опросить всех пользователей, у которых есть сеанс с тем же ip
или cookie_identifier
, что и у конкретного пользователя.
Вот мой запрос:
SELECT *
FROM "users"
WHERE "id" IN
(SELECT "user_id"
FROM "sessions"
WHERE "user_id" <> 1234
AND ("ip" IN
(SELECT "ip"
FROM "sessions"
WHERE "user_id" = 1234
GROUP BY "ip")
OR "cookie_identifier" IN
(SELECT "cookie_identifier"
FROM "sessions"
WHERE "user_id" = 1234
GROUP BY "cookie_identifier"))
GROUP BY "user_id")
Таблица users
имеет ~ 200 000 строк, таблица sessions
имеет ~ 1,5 миллиона строк. Запрос занимает около 3-5 секунд.
Можно ли оптимизировать эти результаты?