Как планировщик запросов СУБД решает, использовать ли индекс?

Ответ

Планировщик запросов (query planner) — это компонент СУБД, который выбирает наиболее эффективный способ выполнения SQL-запроса. Решение об использовании индекса принимается на основе анализа нескольких факторов:


  1. Селективность индекса. Насколько уникальны значения в столбце. Индекс наиболее полезен, если он позволяет отфильтровать большую часть данных (высокая селективность, например, по user_id или email). Если значения часто повторяются (низкая селективность, например, столбец gender), полный перебор таблицы может быть быстрее.



  2. Условия запроса. Индексы активно используются для ускорения операций WHERE, JOIN, ORDER BY и GROUP BY по индексированным полям.



  3. Размер таблицы. Для очень маленьких таблиц планировщик может предпочесть полное сканирование (Full Table Scan), так как накладные расходы на обращение к индексу могут превысить выгоду от его использования.



  4. Статистика данных. СУБД собирает и хранит метаданные о распределении данных в таблицах (гистограммы). Планировщик использует эту статистику для оценки, сколько строк вернет тот или иной узел плана.



  5. Стоимость операций. Планировщик оценивает "стоимость" (в условных единицах CPU и I/O) различных планов выполнения. Он сравнивает стоимость полного сканирования таблицы со стоимостью сканирования по индексу (Index Scan) и выбирает план с наименьшей предполагаемой стоимостью.


Чтобы увидеть, какой план выбрал планировщик, используется команда EXPLAIN. Пример для PostgreSQL:

-- Если есть индекс на email, в плане, скорее всего, будет "Index Scan"
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';