Как добавить индекс в SQL и зачем он нужен (CREATE INDEX)?
Слышал, что запросы можно ускорить индексами, но не понимаю, как и когда их добавлять. Как создать индекс в SQL и зачем он нужен? Почему нельзя просто навесить индексы на все столбцы?
2 ответа
Индекс — это вспомогательная структура (обычно B-дерево), которая помогает базе быстро находить строки по значению столбца, не просматривая всю таблицу. Аналогия — алфавитный указатель в конце книги: вместо листания всех страниц вы открываете нужную сразу.
Создаётся командой CREATE INDEX:
CREATE INDEX idx_users_email ON users (email);
Теперь запрос WHERE email = '...' или JOIN по email будет работать гораздо быстрее на большой таблице: вместо полного перебора (O(n)) поиск идёт примерно за O(log n).
Когда индекс особенно полезен:
- столбцы в WHERE (фильтрация),
- столбцы в условиях JOIN (
ON), - столбцы в ORDER BY (сортировка),
- внешние ключи.
Почему нельзя индексировать всё подряд — у индексов есть цена:
- Они занимают место на диске.
- Они замедляют запись (INSERT/UPDATE/DELETE), потому что при каждом изменении данных индекс тоже надо обновлять.
- Лишние индексы, которые не используются, только мешают.
Поэтому индексы ставят прицельно — на те столбцы, по которым реально часто ищут или соединяют.
Первичный ключ, к слову, индексируется автоматически, отдельный индекс на него создавать не нужно. Для уникальности есть CREATE UNIQUE INDEX.
Полезно знать про составной индекс по нескольким столбцам и правило «левого префикса». Индекс (city, age) ускорит поиск по city и по city + age, но не по одному age — порядок столбцов важен. И учтите: индекс не помогает, если в условии стоит функция от столбца (WHERE LOWER(email) = ...) или шаблон LIKE с % в начале — тогда обычный индекс не используется. Проверить, применился ли индекс, можно командой EXPLAIN перед запросом.