Будет ли атрибут автоматически индексироваться при создании внешнего ключа?

«Будет ли атрибут автоматически индексироваться при создании внешнего ключа?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это зависит от СУБД.

  • В MySQL с движком InnoDB: Да. При создании ограничения FOREIGN KEY InnoDB автоматически создает индекс на столбце (или столбцах), если подходящий индекс еще не существует. Это необходимо для обеспечения целостности и производительности при операциях 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), что крайне неэффективно на больших объемах данных.