На какие столбцы стоит создавать индексы
Что проверяют
Понимаете ли вы, что индекс это не «ускоритель вообще», а структура со своей ценой на записи. И умеете ли выбирать столбцы по селективности и реальным запросам, а не по списку полей сущности.
Как отвечать
Точка отсчёта одна: индексы строятся под запросы, которые действительно ходят в базу. Смотреть надо на план выполнения и на журнал медленных запросов.
Кандидаты на индекс:
- столбцы в условиях отбора, особенно селективные: идентификаторы, внешние ключи, почта, номер документа;
- внешние ключи, по которым идут соединения. Во многих базах индекс под внешний ключ автоматически не создаётся, и без него страдают и соединения, и удаление родительской строки;
- столбцы сортировки и группировки, если порядок в индексе совпадает с нужным: тогда отдельная сортировка не выполняется;
- составной индекс под частую пару условий. Порядок столбцов решает: индекс читается слева направо, и отбор только по второму столбцу его не задействует. Первым ставят столбец с равенством, за ним диапазон.
Отдельно назовите покрывающий индекс, когда все нужные столбцы лежат в самом индексе и до таблицы дело не доходит, и частичный индекс под условие вроде активных строк.
Где индекс не нужен: столбцы низкой селективности вроде флага на два значения, маленькие таблицы, редкие запросы, поиск подстрокой с маской в начале шаблона.
Где спотыкаются
Путают частоту использования с селективностью. Столбец может стоять в каждом запросе и при этом делить таблицу пополам, и такой индекс планировщик просто не возьмёт, предпочтя последовательное чтение.
Забывают про цену. Каждый индекс дописывается при вставке и обновлении, занимает место и участвует в блокировках, поэтому пять индексов на горячей таблице записи это осознанный размен, а не бесплатное улучшение.
Не проверяют, что индекс используется. Функция или приведение типа над столбцом в условии обычно отключает индекс, и помогает либо переписанное условие, либо индекс по выражению. Выясняется это планом запроса, а не предположением.