Короткий ответ
Индекс — объект базы данных, который ускоряет поиск и выборку строк: по аналогии с алфавитным указателем в книге он позволяет СУБД быстро находить нужные данные, не сканируя всю таблицу подряд. Индексы ускоряют 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';Что использовать на практике
- Создавайте индексы целенаправленно — под реальные запросы и нагрузку, а не «на всякий случай» для всех колонок.
- Индексируйте колонки из
WHERE,JOINиORDER BYс хорошей селективностью. - Следите за компромиссом между скоростью чтения и стоимостью операций записи.
Подводные камни
- Избыточные индексы замедляют INSERT/UPDATE/DELETE и занимают место на диске.
- Запись с функцией над колонкой или с ведущей маской в LIKE заставляет СУБД игнорировать индекс.
- На маленьких таблицах оптимизатор может осознанно выбрать полное сканирование, даже если индекс существует.
Как отвечать на собеседовании
- Объясните индекс через аналогию с алфавитным указателем → назовите, что ускоряется: WHERE, JOIN, ORDER BY → укажите цену: место и замедление записи → перечислите типы: кластеризованный, некластеризованный, уникальный, составной → разберите условия эффективности и случаи, когда индекс не работает → завершите правилом создания индексов под реальные запросы.