> Что такое селективность индекса и почему не всегда индекс используется? (Go)

Уровень: junior · Роль: backend · Категория: Технические вопросы

Компании: Сбер, Employcity

Стек: Go

> Пример ответа

Селективность индекса - это мера того, насколько эффективно индекс сужает область поиска. Она определяется как отношение числа уникальных значений в индексированном столбце к общему количеству строк в таблице. Чем выше селективность (ближе к 1), тем меньше строк приходится сканировать после применения индекса. Например, индекс по столбцу id (уникальные значения) имеет селективность 1, а по столбцу is_deleted (всего два значения) - низкую.

Индекс не всегда используется, даже если он существует, по нескольким причинам:

  1. Низкая селективность: Если индекс возвращает слишком много строк (например, >20-30% таблицы), оптимизатору выгоднее выполнить полное сканирование (full scan), так как чтение страниц индекса плюс последующие случайные обращения к данным (lookups) дороже последовательного чтения.

  2. Тип запроса: При использовании функций над столбцом (например, WHERE YEAR(date) = 2023) или неявных преобразований типов индекс может быть проигнорирован.

  3. Статистика устарела: Оптимизатор опирается на статистику распределения данных. Если она не обновлена, он может ошибочно отказаться от индекса.

  4. Покрытие запроса: Если запрос требует выборки многих столбцов, не входящих в индекс, и при этом селективность низкая, оптимизатор предпочтёт full scan, чтобы избежать множественных random I/O.

В Go, при работе с базами данных (например, через database/sql или ORM вроде GORM), важно понимать эти аспекты для написания эффективных запросов и проектирования индексов, особенно в высоконагруженных системах.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью