Ответ
Строго обязательно в подавляющем большинстве случаев. Индексы для внешних ключей критически важны для производительности операций, связанных с целостностью данных и соединениями таблиц.
Без индекса на столбце с внешним ключом:
- Проверка ограничений (CONSTRAINT) при операциях
INSERT/UPDATEв дочерней таблице потребует полного сканирования (FULL SCAN) родительской таблицы для каждого ряда. - Операции
DELETE/UPDATEв родительской таблице (особенно с каскадными действиямиCASCADE) будут выполняться крайне медленно, так как СУБД не сможет быстро найти зависимые строки в дочерней. - Запросы с
JOINпо этому ключу будут неэффективными.
Пример создания (MySQL/PostgreSQL):
-- Индекс часто создается автоматически при объявлении FOREIGN KEY.
-- Но лучше явно убедиться в его наличии.
ALTER TABLE `order_items`
ADD INDEX `idx_order_id` (`order_id`),
ADD CONSTRAINT `fk_order_items_orders`
FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`)
ON DELETE CASCADE;
Исключения, когда индекс может быть избыточным, крайне редки:
- Таблица-справочник с очень малым и фиксированным количеством строк (например,
statusesс 5 записями). - Таблица, в которую только пишут (лог-таблица) и никогда не читают с JOIN или WHERE по этому ключу (маловероятный сценарий).
Правило простое: внешний ключ → индекс.