Если предположить, что user.id
действительно userid
, идеальный индекс будет
CREATE INDEX ON media(userid, source, timestamp);
, который идеально подходит для внутреннего запроса, а индекс также подходит для внешнего запроса.
В этом отношении предполагается, что все вышеприведенные условия являются выборочными, то есть они значительно сокращают количество строк результатов.
В вашем случае кажется, что условие mm.source IN :sources
равно не очень избирательно, возможно, из-за того, что для столбца есть только несколько отдельных значений, или из-за того, что вы запрашиваете часто встречающееся значение.
В этом случае лучше опустить столбец из индекса, потому что это сделает индекс меньше без особых потерь. При прочих равных условиях PostgreSQL выберет сканирование меньшего индекса.