Ни один индекс не поможет вам с этим запросом.
Проблема заключается в том, что у вас есть OR
в AND
состоянии, так что это не представляется возможным применить фильтр перед тем таблицы соединяются, что, где индекс может помочь вам. Попробуйте заменить OR
a AND
и посмотреть, как PostgreSQL может сделать намного лучше.
Таким образом, PostgreSQL должен вычислить все соединение и может только отфильтровывать строки после этого - увидеть большое количество строк, удаленных фильтром Join .
Единственное, что может быть использовано для индекса, - это объединение вложенных циклов, и это будет намного дороже. Поэтому я не думаю, что есть лучший план для этого запроса.
Вы можете видеть, что оценки PostgreSQL по количеству строк довольно хороши, что обычно является признаком того, что PostgreSQL действительно поступил правильно.
Возможно, вы можете сделать лучше с помощью запроса типа
SELECT * FROM
(SELECT ... FROM events JOIN accountsevents ON ...
WHERE accountsevents.accounts_id = 1
UNION
SELECT ... FROM events JOIN accountsevents ON ...
WHERE events.host_id = 1) sub
GROUP BY ... ORDER BY ...
но я бы не стал спорить об этом.
(Примечание: этот запрос семантически немного отличается, но, возможно, в вашем случае это не имеет значения.)