Для этого запроса:
SELECT p.*
FROM posts p
WHERE p.sourceId IN (...)
ORDER BY p.createdAt DESC, p.timestamp DESC
LIMIT 10;
Единственный индекс, который действительно может помочь, это индекс posts(sourceId)
.
Обратите внимание, что я удалил "
. Не экранируйте имена таблиц и столбцов при их определении. Тогда вам не нужно избегать их при использовании.
Однако запрос все равно должен отсортировать все данные. И это может занять много времени. Более сложный запрос легче оптимизировать на Postgres:
select p.*
from ((select p.*
from posts p
where sourceId = $si_1
order by p.createdAt desc, p.timestamp desc
limit 10
) union all
(select p.*
from posts p
where sourceId = $si_2
order by p.createdAt desc, p.timestamp desc
limit 10
) union all
. . .
) p
order by p.createdAt desc, p.timestamp desc;
Этот запрос может использовать индекс на posts(sourceId, createdAt desc, timestamp desc)
для внутренних выборок. Это должно быть быстро. внешний order by
все еще нуждается в сортировке, но объем данных должен быть намного меньше.
Например, если типичный источник имеет 10000 строк, а вы ищете только 3 из них, то ваша версия запрос должен отсортировать 30 000 строк, чтобы получить 10. Эта версия выбирает 30 строк, использует индекс и затем сортирует их, чтобы получить окончательные значения 10.
Это было бы большой разницей в производительности.