Ответ
Для оптимизации запроса с фильтрацией по нескольким полям создается составной (композитный) индекс. Правила формирования:
Основные принципы:
- Порядок полей критичен. Индекс
(A, B, C)эффективен для запросов с условиямиWHERE A = ? AND B = ?, но не дляWHERE B = ?. - Первым идет поле с наивысшей селективностью (наибольшее количество уникальных значений).
- Затем добавляются остальные поля из
WHEREв порядке их использования. - Если есть
ORDER BYилиGROUP BY, поля из этих clauses добавляются в конец индекса.
Пример для PostgreSQL/MySQL:
-- Медленный запрос:
SELECT id, total FROM orders
WHERE user_id = 100
AND status = 'shipped'
AND created_at > '2024-01-01'
ORDER BY created_at DESC;
-- Оптимальный составной индекс:
CREATE INDEX idx_orders_user_status_created
ON orders(user_id, status, created_at DESC);
-- user_id (высокая селективность), затем status, затем created_at для сортировки.
Важные нюансы:
- Индекс не будет использоваться для условий с
LIKE '%prefix'(но будет дляLIKE 'prefix%'). - Условия с
IS NULLили функциями (UPPER(column)) обычно обходят индекс. - Каждый дополнительный индекс замедляет операции
INSERT,UPDATE,DELETEи увеличивает объем хранилища.