← Назад к вопросам

Почему нельзя вставить индексы на все колонки в SQL?

2.0 Middle🔥 71 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему нельзя вставить индексы на все колонки в SQL?

Это отличный вопрос, который раскрывает понимание оптимизации баз данных. Индексы — это не всегда решение, они имеют серьёзные комплексные компромиссы между чтением и записью.

Проблема с индексами на все колонки

Замедление операций записи. Каждый индекс — это отдельная структура данных (обычно B-дерево), которая требует обновления при каждой вставке, обновлении или удалении строки. Если у таблицы 20 колонок и на каждой индекс, то одна вставка потребует обновить индекс в 20 местах. Это экспоненциально увеличивает время операций модификации.

Потребление памяти и дискового пространства. Индекс занимает память и дисковое пространство. Множественные индексы на все колонки могут занять столько же место, сколько сами данные, или даже больше. Для больших таблиц это критично.

Усложнение планирования запросов. Оптимизатор SQL должен выбрать оптимальный индекс (или индексы) для каждого запроса. С 20 индексами выбор становится сложнее и медленнее, плюс оптимизатор может выбрать неоптимальный вариант.

Правильный подход

Индексируй только часто используемые колонки:

  • WHERE условия в SELECT запросах
  • JOIN условия
  • ORDER BY и GROUP BY
  • Foreign keys
// Плохо: индексы на ВСЕ колонки
CREATE INDEX idx_name ON users(name);
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_age ON users(age);
CREATE INDEX idx_city ON users(city);
CREATE INDEX idx_phone ON users(phone);

// Хорошо: индексы только на нужные
CREATE INDEX idx_email ON users(email);        -- часто используется в WHERE
CREATE INDEX idx_user_city ON users(city);     -- фильтрование по городу
CREATE INDEX idx_status_date ON users(status, created_at); -- составной индекс

Составные индексы (composite indexes). Вместо 5 отдельных индексов, создай один составной индекс на часто используемые вместе колонки:

// Вместо этого:
CREATE INDEX idx_first_name ON customers(first_name);
CREATE INDEX idx_last_name ON customers(last_name);

// Сделай это:
CREATE INDEX idx_customer_name ON customers(first_name, last_name);

Анализируй реальные запросы. Используй инструменты типа EXPLAIN для анализа планов выполнения запросов.

Практическое правило

Индексируй примерно 10-15% колонок таблицы. Каждый индекс должен иметь четкое назначение: либо поддерживать WHERE условие, либо ускорить JOIN, либо помочь ORDER BY.

Помни: индекс — это инвестиция памяти для экономии времени на чтение. Чем больше индексов, тем медленнее запросы на запись. Баланс критичен.

Почему нельзя вставить индексы на все колонки в SQL? | PrepBro