Ответ
Планировщик запросов (query planner) — это компонент СУБД, который выбирает наиболее эффективный способ выполнения SQL-запроса. Решение об использовании индекса принимается на основе анализа нескольких факторов:
Селективность индекса. Насколько уникальны значения в столбце. Индекс наиболее полезен, если он позволяет отфильтровать большую часть данных (высокая селективность, например, по
user_id
илиemail
). Если значения часто повторяются (низкая селективность, например, столбецgender
), полный перебор таблицы может быть быстрее.Условия запроса. Индексы активно используются для ускорения операций
WHERE
,JOIN
,ORDER BY
иGROUP BY
по индексированным полям.Размер таблицы. Для очень маленьких таблиц планировщик может предпочесть полное сканирование (Full Table Scan), так как накладные расходы на обращение к индексу могут превысить выгоду от его использования.
Статистика данных. СУБД собирает и хранит метаданные о распределении данных в таблицах (гистограммы). Планировщик использует эту статистику для оценки, сколько строк вернет тот или иной узел плана.
Стоимость операций. Планировщик оценивает "стоимость" (в условных единицах CPU и I/O) различных планов выполнения. Он сравнивает стоимость полного сканирования таблицы со стоимостью сканирования по индексу (Index Scan) и выбирает план с наименьшей предполагаемой стоимостью.
Чтобы увидеть, какой план выбрал планировщик, используется команда EXPLAIN
. Пример для PostgreSQL:
-- Если есть индекс на email, в плане, скорее всего, будет "Index Scan"
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';