Почему нельзя индексировать все поля таблицы в базе данных
Что проверяют
Понимаете ли вы, что индекс это компромисс, и знаете ли, чем платят за лишние индексы.
Как отвечать
Индекс ускоряет чтение и замедляет всё остальное. Платят за него четырьмя способами.
1. Запись. Каждый INSERT, UPDATE и DELETE обновляет все индексы таблицы. Десять индексов означают десятикратную дополнительную работу на каждой вставке. На таблице с активной записью это главный ограничитель.
2. Место и память. Индексы занимают диск, но важнее другое: они конкурируют с данными за буферный кэш. Неиспользуемые индексы вытесняют оттуда полезные страницы, и общая производительность падает, хотя формально ничего не сломалось.
3. Планировщик. Он перебирает варианты и оценивает их стоимость. Большое число индексов усложняет выбор, увеличивает время планирования и иногда приводит к худшему плану, потому что оценки неточны.
4. Обслуживание. Индексы раздуваются при интенсивных изменениях, требуют перестроения, а их создание на большой таблице без специального режима блокирует запись.
Отдельно важно: большинство индексов при этом не будет использовано. На конкретный запрос планировщик выберет один, максимум пару. Россыпь одиночных индексов почти всегда проигрывает нескольким продуманным составным, потому что составной обслуживает и запросы по первым колонкам.
Индексы, которые заведомо бесполезны: по колонке с низкой избирательностью вроде признака или пола, под условие с функцией над колонкой, под поиск по шаблону с ведущим символом подстановки.
Правильный подход: индексы создаются под конкретные запросы, а не на всякий случай. Неиспользуемые находят по системной статистике, где число сканирований остаётся нулевым, и удаляют.
Где спотыкаются
Называют только расход места, забывая про замедление записи.
Не знают про конкуренцию за буферный кэш.
Ставят по индексу на каждую колонку вместо составного.
Никогда не проверяют, используются ли созданные индексы.