По каким критериям можно определить необходимость добавления индекса в БД
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Критерии добавления индекса в БД
Добавление индексов - это баланс между скоростью чтения и стоимостью записи.
Основные критерии
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,000
- Selectivity > 50%
- Используется в > 10% запросов
- Выборка < 10% строк
- Read/Write ratio > 2
- Не замедляет запись
Всегда проверяй с EXPLAIN.