Является ли создание индексов на всех полях таблицы хорошей практикой?

Ответ

Нет, это антипаттерн, который приводит к серьезным проблемам с производительностью.

Негативные последствия:

  1. Замедление операций записи (INSERT, UPDATE, DELETE): При каждой модификации данных СУБД должна обновлять все индексы, что значительно увеличивает нагрузку на ввод-вывод и время выполнения.
  2. Избыточное потребление памяти/диска: Каждый индекс — это дополнительная структура данных, занимающая место.
  3. Усложнение работы оптимизатора: Избыток индексов может запутать планировщик запросов, что приведет к выбору неоптимального плана выполнения.

Рекомендации по созданию индексов:

  • Индексируйте поля, используемые в условиях WHERE, JOIN, ORDER BY, GROUP BY.
  • Рассматривайте составные индексы для часто используемых комбинаций полей.
  • Избегайте индексов на:
    • Поля с низкой селективностью (например, gender, status с малым числом значений).
    • Поля, которые редко используются в запросах.

Пример плохого и хорошего подхода:

-- ПЛОХО: Индекс на все поля
CREATE INDEX idx_bad ON users (id, name, email, created_at, status);

-- ХОРОШО: Специфичные индексы под запросы
CREATE INDEX idx_users_email ON users(email); -- Для поиска по email
CREATE INDEX idx_users_created_status ON users(created_at, status); -- Для отчетов

Вывод: Индексы должны создаваться целенаправленно, на основе анализа реальной нагрузки и частых запросов.

Ответ 18+ 🔞

Да ты посмотри, что творят-то! Это ж классический случай, когда человек, не разобравшись, начинает индексы на всё подряд лепить, как обои в туалете. Думает: «А, хуле, накидаю индексов — быстрее будет!». А в итоге получается такая жесть, что база начинает шевелиться, как сонная муха в патоке.

Чё конкретно проёбывается:

  1. Каждая запись превращается в цирк. Ты там INSERT или UPDATE делаешь, а база в это время должна по всем твоим ебуччим индексам пробежаться и каждый обновить. Это как зайти в магазин за хлебом, а тебя заставляют по пути во все отделы заглянуть и везде расписаться. Время и ресурсы — в пизду.
  2. Место жрёт, как не в себя. Каждый индекс — это ещё одна папка с бумажками. Накидал их овердохуища — и всё, диск забит хламом, который, может, и не нужен вовсе.
  3. Оптимизатор сходит с ума. Представь, ты приходишь на склад, а там на каждую коробку по 10 разных ярлыков наклеено. И ты стоишь, ебешься с мозгом: «Какой же из них правильный?». Вот и СУБД так же тупит, глядя на твой зоопарк индексов, и может выбрать самый долгий путь.

Так как же, блядь, правильно?

  • Индексируй то, что реально ищут. Поля в WHERE, JOIN, ORDER BY — вот твои кандидаты. Остальное — похуй.
  • Составные индексы — твой друг. Если постоянно ищешь по дате И статусу, сделай один индекс на (created_at, status). Умно и эффективно.
  • Не трогай то, что не надо. Поле пол (значений «М»/«Ж») или флаг_активности (0/1) — индексировать это всё равно что прибивать скотчем суп. Селективность — ноль, пользы — ноль.

Смотри, как отличаются подходы:

-- ПИЗДЕЦ КАК НЕ НАДО: Навесил на всё, что движется. Хуйня полная.
CREATE INDEX idx_bad ON users (id, name, email, created_at, status);

-- А ВОТ КАК РАЗУМНО: Конкретно под задачи. Для поиска по почте — один индекс.
CREATE INDEX idx_users_email ON users(email);
-- Для отчётов «показать новых активных юзеров» — другой.
CREATE INDEX idx_users_created_status ON users(created_at, status);

Итог, ёпта: Индекс — это не магическая таблетка «на всё про всё», а хирургический инструмент. Применяй его точечно, глядя на реальные запросы. А то так и до медного таза недалеко.