Приведи примеры индексов
Что проверяют
Знаете ли вы, какие индексы бывают, и понимаете ли, когда каждый включается. От разработчика на Go ждут не алфавитного списка, а связки с запросами сервиса: какой индекс закроет фильтр и сортировку, что покажет план выполнения и почему индекс иногда не берётся.
Как отвечать
Идите от задачи:
- B-дерево: умолчание, покрывает равенство, диапазоны, сортировку, проверку на
NULL; - составной: порядок колонок важен, годится, если запрос использует левый префикс.
(user_id, created_at)закроет фильтр по пользователю вместе с сортировкой по дате, а отдельный фильтр по дате нет; - уникальный: не столько ускорение, сколько ограничение целостности, на нём же держится вставка с обновлением при конфликте;
- частичный: условие прямо в определении индекса, например только активные строки. Индекс меньше и дешевле в поддержке;
- по выражению:
lower(email), иначе поиск без учёта регистра индекс не возьмёт; - хеш: только равенство, ни диапазонов, ни сортировки;
- GIN: массивы,
jsonb, полнотекстовый поиск; - GiST: геометрия, диапазоны, поиск ближайших;
- BRIN: огромная таблица, физически упорядоченная по времени, сам индекс крошечный.
Обязательно назовите цену: каждый индекс замедляет запись и занимает место, поэтому неиспользуемые находят по статистике обращений и убирают.
Где спотыкаются
Уверенно называют bitmap как тип индекса в PostgreSQL или MySQL. Такого объекта там нет: в PostgreSQL битовая карта это способ выполнения, планировщик строит её на лету поверх обычных индексов. Постоянные bitmap-индексы живут в других СУБД.
Второе: считают, что раз индекс создан, он и включится. Функция поверх колонки, приведение типа, шаблон с ведущим символом подстановки или выборка большей части таблицы отправляют запрос на последовательное чтение. Проверяют это планом на данных, похожих на боевые, а не на пустой таблице.
Третье: вешают отдельный индекс на каждую колонку из условия. Для фильтра по нескольким полям обычно выигрывает один составной в правильном порядке, а десяток одиночных только утяжеляет вставку.