Ответ
Добавление индексов не рекомендуется в следующих случаях:
1. На столбцах с низкой селективностью:
- Булевы значения (
is_active,gender) - Перечисления с малым количеством вариантов
- Почему: Индекс неэффективен, когда нужно выбрать большую часть таблицы
-- Плохой кандидат для индекса
CREATE INDEX idx_status ON orders(status);
-- status имеет только 3 значения: 'NEW', 'PROCESSING', 'DONE'
2. На часто изменяемых таблицах:
- Каждый
INSERT,UPDATE,DELETEтребует обновления индексов - Замедляет операции записи
- Увеличивает размер таблицы
3. На маленьких таблицах:
- Полное сканирование (full table scan) может быть быстрее
- Обычно для таблиц < 1000 строк
4. Когда запросы не могут использовать индекс:
-
Использование функций над столбцом:
-- Индекс по name не будет использован SELECT * FROM users WHERE UPPER(name) = 'JOHN'; -
Поиск с
LIKEс начальным wildcard:-- Индекс не используется SELECT * FROM products WHERE name LIKE '%apple%';
-- Индекс МОЖЕТ использоваться SELECT * FROM products WHERE name LIKE 'apple%';
**5. При избыточных индексах:**
- Несколько индексов с пересекающимися столбцами
- Индексы, которые никогда не используются
- **Решение:** Анализировать `EXPLAIN` и статистику использования
**Общее правило:** Добавляйте индексы обдуманно, анализируя:
1. Селективность столбцов
2. Соотношение операций чтения/записи
3. Фактические запросы приложения
4. Размер таблицы