Почему индексы могут быть незадействованы в PostgreSQL
Python
Middle
Aston
Почему индексы могут быть незадействованы в PostgreSQL
Ответы
В PostgreSQL индексы могут не использоваться по нескольким причинам:
- **Низкая селективность** - если индекс охватывает слишком много строк (например, булево поле с 50% распределением), оптимизатор может выбрать полное сканирование таблицы.
- **Несоответствие типов** - если в запросе используется неявное приведение типов (например, сравнение строки с числом), индекс не будет задействован.
- **Отсутствие статистики** - устаревшая или недостаточная статистика может привести к неправильному выбору плана выполнения.
- **Маленькие таблицы** - для таблиц с небольшим количеством строк сканирование часто бывает быстрее, чем использование индекса.
Пример:
```
-- Индекс не будет использован, если поле приводится к другому типу
CREATE INDEX idx_users_phone ON users(phone);
SELECT * FROM users WHERE phone = 12345; -- phone - text, а сравнивается с числом
```
- **Использование функций** - если поле обернуто в функцию, индекс не используется:
```
SELECT * FROM users WHERE lower(name) = 'john';
```
- **Неоптимальные условия** - составные индексы требуют правильного порядка условий в запросе.