Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работают индексы в БД: от теории к практике
Индексы это одна из самых важных конструкций для производительности БД. Вопрос о них часто встречается на собеседованиях, потому что это мост между бизнес-логикой и техническими ограничениями.
Аналогия для понимания
Представь книгу из 1000 страниц без оглавления. Чтобы найти информацию про индексы, нужно прочитать все 1000 страниц. Это полное сканирование таблицы (Full Table Scan).
Теперь представь, что в конце книги есть алфавитный указатель (Index). Для слова индексы ты находишь страницы 145, 278, 512 за 30 секунд. Это использование индекса.
В БД то же самое.
Что такое индекс
Индекс это отдельная структура данных, которая:
- Содержит отсортированные значения из одного или нескольких столбцов
- Указывает на позиции соответствующих строк в таблице
- Позволяет быстро находить данные без сканирования всей таблицы
Применение индекса ускоряет чтение, но замедляет запись потому что при INSERT, UPDATE, DELETE нужно обновлять индекс.
Структура индекса: B-Tree
Большинство СУБД (PostgreSQL, MySQL, Oracle) используют B-Tree (Balanced Tree) для индексов.
Особенности B-Tree:
- Дерево сбалансировано, поиск O(log n), а не O(n)
- Отсортировано, хорошо для range queries
- Логарифмическая сложность означает, что в индексе из 1 млн записей нужно 20 сравнений вместо 500к
Как индекс работает на практике
Пример таблицы:
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email VARCHAR(255),
created_at TIMESTAMP
);
Без индекса SELECT по email проверяет каждую из 1 млн строк (500 мс).
С индексом БД ищет в B-Tree индексе (20 сравнений, 1 мс). Ускорение в 500 раз!
Типы индексов
PRIMARY KEY автоматический индекс, гарантирует уникальность.
UNIQUE индекс гарантирует отсутствие дубликатов, также ускоряет поиск.
Single-column индекс на одном столбце.
Composite индекс на нескольких столбцах. Порядок критичен! Индекс (user_id, created_at) хорошо работает для WHERE user_id = 123 AND created_at > дата, но плохо работает для WHERE created_at > дата.
FULLTEXT индекс для полнотекстового поиска.
PARTIAL индекс на части таблицы. Меньше памяти, быстрее обновляется.
Когда индекс помогает
- WHERE clause с индексированным столбцом
- ORDER BY и GROUP BY по индексу
- JOIN условия
- LIMIT с ORDER BY
Когда индекс НЕ помогает
- Функции на столбце (UPPER(email))
- LIKE с процентом в начале
- OR условия если не все части индексированы
- Когда результат большая часть таблицы
Trade-offs индексов
Плюсы:
- Ускорение SELECT запросов в 10-1000 раз
Минусы:
- Занимают дополнительную память (20-30% размера таблицы)
- Замедляют INSERT, UPDATE, DELETE
- Требуют обслуживания (дефрагментация)
Как выбрать, какие индексы создавать
- Профилируй запросы с EXPLAIN
- Найди медленные запросы
- Определи столбцы в WHERE, JOIN ON, ORDER BY
- Создавай индексы на часто используемые столбцы
Рекомендации
- Всегда индексируй PRIMARY KEY
- Индексируй FOREIGN KEY для быстрых JOIN
- Индексируй столбцы в WHERE если они часто используются
- Составной индекс экономит память больше чем несколько индексов
- Удаляй неиспользуемые индексы
- Пересматривай индексы раз в полгода
Заключение
Индексы это один из главных инструментов для масштабирования БД. Правильно выбранные индексы ускоряют систему в десятки раз. Но неправильные индексы займут место и замедлят запись. Ключ профилирование и правильный выбор стратегии.