Для первого запроса в вашем вопросе:
select * from matches_tb1 order by match_id desc limit 10;
По плану EXPLAIN
выясняется, что Postgres не использует индекс match_id
B-дерева.Это приводит к очень длинному запросу, потому что базе данных приходится сканировать всю таблицу с 500 миллионами записей и сортировать, чтобы найти 10 записей.Что касается , почему Postgres не может использовать индекс, проблема в select *
.Когда база данных достигает конечного узла каждой записи в индексе, она находит только значение для match_id
.Однако, поскольку вы делаете select *
, базе данных придется выполнить поиск в кластеризованном индексе, чтобы найти значения для всех остальных столбцов.Если ваша таблица имеет низкую корреляцию, то оптимизатор, скорее всего, решит полностью отказаться от индекса и просто выполнить полное сканирование таблицы.
Для сравнения рассмотрим один из ваших других запросов, который выполняется быстро:
select match_id from matches_tb1 where match_id > 4164287140
order by match_id desc limit 10
В этом случае можно использовать индекс match_id
, поскольку вы выбираете только match_id
.Кроме того, ограничение в предложении where
помогает еще больше сделать индекс более конкретным.
Таким образом, решение вашей проблемы здесь состоит в том, чтобы не делать select *
с limit
, если вы хотитезапрос, чтобы закончить быстро.Например, если вы хотите, чтобы в вашей таблице были только два столбца col1
и col2
, вы можете добавить эти столбцы в индекс, чтобы покрыть их.Тогда следующий запрос также должен быть быстрым:
select match_id, col1, col2 from matches_tb1 order by match_id desc limit 10;