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

По каким критериям можно определить необходимость добавления индекса в БД

2.0 Middle🔥 161 комментариев
#Другое

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

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

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

# Критерии добавления индекса в БД

Добавление индексов - это баланс между скоростью чтения и стоимостью записи.

Основные критерии

1. Размер таблицы

  • Таблица < 1,000 строк: НЕ нужен
  • Таблица 1,000-100,000: Может быть нужен
  • Таблица > 100,000: Вероятно нужен
  • Таблица > 1,000,000: Обязателен для часто используемых колонок

2. Selectivity

Уникальные значения разделить на общее число строк:

  • Высокая selectivity (75-100%): Хороший кандидат
  • Низкая selectivity (< 5%): Бесполезен

3. Частота использования

  • Редко (< 5%): Не индексируем
  • Средне (5-20%): Смотрим другие критерии
  • Часто (> 20%): Хороший кандидат

4. Процент выбираемых строк

  • Выборка < 5%: Индекс эффективен
  • Выборка 5-10%: Индекс может помочь
  • Выборка > 20%: Индекс неэффективен

Когда ТОЧНО нужен индекс

Primary Key и Unique

Всегда индексируются автоматически

Foreign Key

Рекомендуется индексировать для быстрого join

WHERE условия

Если 50% запросов используют одну колонку

ORDER BY

Индекс помогает сортировке

Когда индекс НЕ нужен

Низкая selectivity

Если только 2-3 уникальных значения

Много INSERT/UPDATE/DELETE

Каждый индекс замедлит запись на 10-20%

Редко используемые колонки

Используется в < 1% запросов

PostgreSQL анализ

Узнать размер таблицы: SELECT schemaname, tablename, n_live_tup FROM pg_stat_user_tables;

Узнать использование индексов: SELECT tablename, indexname, idx_scan FROM pg_stat_user_indexes;

Найти неиспользуемые: SELECT indexname FROM pg_stat_user_indexes WHERE idx_scan = 0;

MySQL анализ

Размер таблицы: SELECT table_name, table_rows FROM information_schema.tables;

Использование индексов: SELECT * FROM performance_schema.table_io_waits_summary_by_index_usage;

Типы индексов

Simple (одна колонка)

CREATE INDEX idx_users_email ON users(email);

Composite (несколько колонок)

CREATE INDEX idx_on_cols ON orders(user_id, created_at DESC);

Partial

CREATE INDEX idx_active ON users(email) WHERE deleted_at IS NULL;

Матрица решений

Размер > 1K + Selectivity > 50% + Частота > 10% = индекс нужен Размер < 1K = индекс не нужен Низ кая selectivity + мало операций = может быть нужен

Мониторинг в Java

Финд неиспользуемые индексы в определённое время и логируй их. Это помогает удалять неполезные индексы и экономить память.

Резюме

Индекс нужен если:

  1. Размер таблицы > 1,000
  2. Selectivity > 50%
  3. Используется в > 10% запросов
  4. Выборка < 10% строк
  5. Read/Write ratio > 2
  6. Не замедляет запись

Всегда проверяй с EXPLAIN.

По каким критериям можно определить необходимость добавления индекса в БД | PrepBro