@AlexKuznec

Обязателен ли индекс для внешнего ключа InnoDB MySQL?

В Yii2 при автоматической генерации миграции по созданию таблицы с внешним ключом создается функция с такой структурой:

- создать таблицу
- создать индекс на поле внешнего ключа
- создать внешний ключ

Таблица нормально создается и без индекса. Некоторые не советуют создавать индексы при проектировании таблиц, только при накоплении нескольких тысяч записей в таблице для ускорения запросов.

Вопрос 1: зачем встроили создание индекса?

Функция отката миграции имеет обратную структуру:
- удалить внешний ключ
- удалить индекс
- удалить таблицу

Вопрос 2: разве при удалении таблицы индекс и ключ не удаляются вместе с ней? Или в разных СУБД бывает по-разному?
  • Вопрос задан
  • 2938 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
Обязателен ли индекс для внешнего ключа InnoDB MySQL?

Да обязателен

Таблица нормально создается и без индекса.

При создании таблицы индекс на внешние ключи добавляется автоматически.

Некоторые не советуют создавать индексы при проектировании таблиц, только при накоплении нескольких тысяч записей в таблице для ускорения запросов

Тут нужно понимать в чем разница между индексом созданным Вами по любому из полей, и индексом по внешнему ключу. Не рекомендуется заранее создавать индексы, т.к. на этапе разработки просто не понятно какие индексы действительно будут использоваться,на практике, а без каких можно обойтись (тем самым сэкономив время записи данных). С внешними ключами же история немного другая, они служат для проверки целостности данных, при вставке/редактировании (про всякие там джойны - вообще молчу). А значит каждый раз когда Вы добавляете запись, необходимо найти соответствующую запись по внешнему ключу. Поиск без индекса происходит очень медленно, поэтому его использование в этой ситуации по умолчанию вполне оправдано.

Вопрос 1: зачем встроили создание индекса?

Это плата за независимость от СУБД

Вопрос 2: разве при удалении таблицы индекс и ключ не удаляются вместе с ней? Или в разных СУБД бывает по-разному?

Аналогично с предыдущим пунктом, это плата за независимость от СУБД
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SamDark
@SamDark
Yii2 core team
Вопрос 1: зачем встроили создание индекса?


Потому что индекс можно создавать и не по внешнему ключу.

Вопрос 2: разве при удалении таблицы индекс и ключ не удаляются вместе с ней? Или в разных СУБД бывает по-разному?

Потому что индексы иногда необходимо удалять отдельно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы