Ответ
Это зависит от СУБД.
- В MySQL с движком InnoDB: Да. При создании ограничения
FOREIGN KEYInnoDB автоматически создает индекс на столбце (или столбцах), если подходящий индекс еще не существует. Это необходимо для обеспечения целостности и производительности при операцияхDELETEиUPDATEв родительской таблице. - В других СУБД (например, PostgreSQL, SQL Server): Нет. Создание внешнего ключа не приводит к автоматическому созданию индекса. Индекс нужно создавать явно.
Практический пример и рекомендация:
-- В MySQL/InnoDB индекс создастся автоматически.
-- В PostgreSQL индекс НЕ создастся, его нужно добавить вручную.
ALTER TABLE orders
ADD CONSTRAINT fk_orders_user_id
FOREIGN KEY (user_id) REFERENCES users(id);
-- Явное создание индекса — лучшая практика для всех СУБД.
-- Это ускоряет JOIN и проверку целостности при удалении/обновлении родительской записи.
CREATE INDEX idx_orders_user_id ON orders(user_id);
Почему это важно? Без индекса на столбце внешнего ключа операции DELETE из родительской таблицы (users) или JOIN с таблицей orders будут выполняться полным сканированием дочерней таблицы (orders), что крайне неэффективно на больших объемах данных.