Postgres - индекс с несколькими предложениями where - PullRequest
1 голос
/ 27 апреля 2020

У меня есть запрос, который включает два предложения WHERE. Выглядит так:

SELECT m 
FROM Media m 
WHERE m.userid = :id 
  AND m.timestamp = (SELECT MAX(mm.timestamp) 
                     FROM Media mm 
                     WHERE mm.userid = :id 
                       AND mm.source IN :sources 
                       AND mm.timestamp < :date)

Что я хочу знать, будет ли этот запрос быстрее с одним индексом или мне нужно создать два отдельных индекса для каждого предложения WHERE? Как:

  • 1-й индекс для 1-го WHERE = (userid, timestamp)
  • 2-й индекс для 2-го WHERE = (userid, source, timestamp)

РЕДАКТИРОВАТЬ:

У меня есть создано 2 индекса.

  • 1 - (userid, source, timestamp)
  • 2 - (userid, timestamp)

Когда я анализирую запрос, он всегда показывает второй индекс используется для запроса.

1 Ответ

3 голосов
/ 27 апреля 2020

Если предположить, что user.id действительно userid, идеальный индекс будет

CREATE INDEX ON media(userid, source, timestamp);

, который идеально подходит для внутреннего запроса, а индекс также подходит для внешнего запроса.

В этом отношении предполагается, что все вышеприведенные условия являются выборочными, то есть они значительно сокращают количество строк результатов.

В вашем случае кажется, что условие mm.source IN :sources равно не очень избирательно, возможно, из-за того, что для столбца есть только несколько отдельных значений, или из-за того, что вы запрашиваете часто встречающееся значение.

В этом случае лучше опустить столбец из индекса, потому что это сделает индекс меньше без особых потерь. При прочих равных условиях PostgreSQL выберет сканирование меньшего индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...