Sobes.tech
Назад к вопросам
Junior — Middle
58

Какие методы создания индексов позволяют ускорить поиск по двум полям в таблице базы данных?

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

sobes.tech AI

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

Для ускорения поиска по двум полям обычно используют составной индекс из нескольких колонок. Если нужны независимые фильтры по каждому полю, иногда дополнительно создают отдельные индексы на каждое поле. Выбор зависит от того, как именно пишутся запросы: WHERE a = ... AND b = ... или отдельно по a и b.

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

Индекс — это структура данных, которая ускоряет поиск строк в таблице.
Для двух полей чаще всего применяют:

  • Составной индекс по двум колонкам, например (field1, field2).
  • Отдельные индексы на field1 и field2, если запросы часто используют их по отдельности.
  • В некоторых СУБД возможны покрывающие индексы или частичные индексы, но базовый ответ на собеседовании — составной индекс.

Составной индекс особенно эффективен, когда запрос фильтрует по первому полю индекса или по обоим полям вместе.

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

CREATE INDEX idx_orders_customer_status
ON orders (customer_id, status);

Пример запроса, который может использовать такой индекс:

SELECT *
FROM orders
WHERE customer_id = 42 AND status = 'paid';

Если часто ищут только по customer_id, такой индекс тоже поможет. Но если запросы чаще идут только по status, составной индекс (customer_id, status) может быть менее полезен из-за порядка колонок.

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

В примере создаётся индекс idx_orders_customer_status по двум полям таблицы orders.

  1. customer_id стоит первым в индексе.
  2. status стоит вторым.
  3. Запрос с условиями по обоим полям может быстро найти нужные строки, не просматривая всю таблицу.
  4. Порядок колонок важен: индекс лучше работает по первому полю и по комбинации полей в заданном порядке.

Если нужны быстрые поиски и по customer_id, и по status по отдельности, можно создать два отдельных индекса:

CREATE INDEX idx_orders_customer_id ON orders (customer_id);
CREATE INDEX idx_orders_status ON orders (status);

Но это не всегда лучше: два индекса ускоряют чтение, но могут замедлить вставку, обновление и занимают больше места.

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

  • Для поиска по двум полям чаще всего нужен составной индекс.
  • Порядок полей в индексе важен: обычно сначала ставят более селективное или часто используемое в фильтре поле.
  • Отдельные индексы полезны, если поля часто используются независимо друг от друга.
  • Индекс помогает не только при WHERE, но и иногда при JOIN, ORDER BY, GROUP BY.
  • Избыточное количество индексов ухудшает скорость записи и увеличивает расход памяти.