Вы сами ответили на вопрос в названии, набрав EXPLAIN
.План запроса показывает, какие индексы используются и как.Подробнее см. Главу «Использование EXPLAIN» в руководстве.
Что касается того, почему в запросе используется последовательное сканирование без индексов: 25 миллионов строк, 2992781 rows removed
.Вы получаете 24709900 rows
, это почти все строки.
Это никогда не будет быстрым.
Это никогда не будет использовать индекс.
Использование индекса имеет смысл толькодля небольшой доли всех рядов.В противном случае это просто добавит дополнительную стоимость.В зависимости от ряда сопутствующих факторов планировщик запросов Postgres начинает рассматривать индекс btree примерно для 5% всех строк или меньше.Связанный:
Хорошо, если строки таблицы значительно шире, чем три столбцав вашем списке SELECT
частичный , охватывающий индекс , может несколько помочь, если вы получите из него только сканирование по индексу.Опять же, необходимо выполнить некоторые предварительные условия.И каждый индекс также имеет затраты на хранение и обслуживание.
В сторону: заявленный комментарий, значения NULL не могут быть проиндексированы.Это неверно, значения NULL могут быть проиндексированы.Не так эффективно, как другие ценности, но не имеет большого значения.Также не имеет отношения к делу под рукой.