Короткий ответ
Индекс — объект базы данных, который ускоряет поиск и выборку строк: по аналогии с алфавитным указателем в книге он позволяет СУБД быстро находить нужные данные, не сканируя всю таблицу подряд. Индексы ускоряют SELECT с условиями в WHERE, с JOIN и с сортировкой ORDER BY.
Как это работает подробнее
Плата за индекс — дополнительное место для хранения структур и нагрузка на операции записи: при каждом INSERT, UPDATE и DELETE индексы нужно обновлять. Индекс эффективен на колонках, которые часто используются в WHERE, условиях JOIN и ORDER BY, и когда колонка имеет хорошую селективность — много различных значений.
- Кластеризованный: определяет физический порядок хранения строк, может быть только один на таблицу, обычно строится на первичном ключе.
- Некластеризованный: отдельная структура с указателями на строки; таких индексов может быть несколько.
- Уникальный и составной: уникальный гарантирует отсутствие дубликатов, составной строится по нескольким колонкам.
- Когда индекс не сработает: функция над колонкой (
WHERE YEAR(date) = 2025), шаблон с ведущей маской (LIKE '%text'), низкая селективность или решение оптимизатора, что дешевле полное сканирование таблицы.
Пример кода
Создание и использование индекса
CREATE INDEX idx_lastname ON Employees(LastName);
-- теперь запрос может использовать индекс
SELECT * FROM Employees WHERE LastName = 'Smith';Что использовать на практике
- Создавайте индексы целенаправленно — под реальные запросы и нагрузку, а не «на всякий случай» для всех колонок.