Sobes.tech
Назад к вопросам
Middle
10

Какие виды индексов существуют?

Компании, где спрашивали
IGaming

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Индексы бывают разных типов, и каждый оптимизирует поиск под свой сценарий: точные совпадения, диапазоны, сортировку, полнотекстовый поиск. Важно понимать не только названия, но и когда индекс помогает, а когда мешает из-за накладных расходов на запись. Хороший ответ — это умение сопоставить тип индекса с типом запроса и структурой данных.

Определение:

Индекс в базе данных — это вспомогательная структура данных, которая ускоряет поиск и сортировку строк в таблице. Разные виды индексов отличаются тем, как они устроены и для каких запросов подходят лучше всего. Обычно выделяют кластерные и некластерные индексы, а также специализированные варианты: уникальные, составные, полнотекстовые, пространственные, хэш-индексы и другие в зависимости от СУБД.

Пример использования:

Если часто ищут пользователя по email, имеет смысл создать индекс по этому полю. Если запросы фильтруют данные по нескольким колонкам, например по UserId и CreatedAt, можно использовать составной индекс. Для текстового поиска по описаниям товаров лучше подходит полнотекстовый индекс.

-- Уникальный индекс для email
CREATE UNIQUE INDEX IX_Users_Email ON Users (Email);

-- Составной индекс для частых фильтров
CREATE INDEX IX_Orders_UserId_CreatedAt ON Orders (UserId, CreatedAt);

-- Полнотекстовый поиск, если СУБД поддерживает
-- CREATE FULLTEXT INDEX ...

Пояснение кода:

Код показывает три типичных сценария.

В первом случае уникальный индекс по Email не только ускоряет поиск, но и запрещает дубликаты.

Во втором случае составной индекс по (UserId, CreatedAt) полезен, когда запросы часто используют оба поля вместе или фильтруют по первому полю с дальнейшей сортировкой/диапазоном по второму.

В третьем случае для текстового поиска нужен не обычный B-tree индекс, а специальный полнотекстовый механизм, потому что он предназначен для поиска слов и фраз внутри больших текстов.

Ключевые моменты:

  • Кластерный индекс определяет физический порядок хранения строк в таблице или максимально близок к нему; обычно такой индекс может быть только один.
  • Некластерный индекс хранит отдельную структуру ссылок на строки и может существовать в большом количестве.
  • Уникальный индекс не допускает дубликаты значений в индексируемом поле или наборе полей.
  • Составной индекс строится по нескольким колонкам и особенно эффективен, когда запросы используют их в нужном порядке.
  • Полнотекстовый индекс нужен для поиска по словам и фразам в больших текстовых полях, а не для точного сравнения.
  • Специализированные индексы вроде хэш- или пространственных зависят от СУБД и нужны для конкретных типов данных и запросов.