Ответ 1
Да, но только на Innodb. Innodb является единственным в настоящее время отправленным табличным форматом, в котором реализованы внешние ключи.
Автоматически ли индексирует столбцы внешнего ключа MySQL?
Да, но только на Innodb. Innodb является единственным в настоящее время отправленным табличным форматом, в котором реализованы внешние ключи.
По-видимому, индекс создается автоматически, как указано в ссылка robert опубликовала.
InnoDB требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы. В таблице ссылок должен быть индекс, в котором столбцы внешнего ключа перечислены в качестве первых столбцов в том же порядке. Такой индекс создается в таблице ссылок автоматически, если он не существует. (Это противоречит некоторым более старым версиям, в которых индексы должны были быть созданы явно или создание ограничений внешнего ключа не получилось.) index_name, если задано, используется, как описано ранее.
Да, см. Ограничения InnoDB и FOREIGN KEY.
Вы не получите индекс автоматически, если вы используете ALTER TABLE (вместо CREATE TABLE), по крайней мере, согласно документам (ссылка предназначена для 5.1 но это то же самое для 5.5):
[...] Когда вы добавляете ограничение внешнего ключа в таблицу с помощью ALTER TABLE, не забудьте сначала создать необходимые индексы.
Как указано, это относится к InnoDB. Сначала мне показалось странным, что многие другие (в частности, MS SQL и DB2) этого не делают. Сканирование табличного пространства лучше, чем сканирование индексов, когда очень мало строк таблицы, поэтому в подавляющем большинстве случаев иностранный ключ хотел бы проиндексировать. Тогда это меня поразило - это не обязательно означает, что это должен быть отдельный (один столбец) индекс - где он находится в автоматическом индексе FK MySQL. Таким образом, возможно, именно по этой причине MS SQL, DB2 (Oracle я не уверен) и т.д. Оставляют это до DBA; после того как все несколько индексов на больших таблицах могут вызвать проблемы с производительностью и пространством.
Для тех, кто ищет цитату из 5.7
docs:
MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешнего ключа могут быть быстрыми и не требуют сканирования таблицы. в таблицы ссылок, должен быть индекс, где внешний ключ столбцы перечисляются в качестве первых столбцов в том же порядке. Такой индекс создается в справочной таблице автоматически, если он не существовать. Этот индекс можно было бы отключить позже, если вы создадите другой индекс, который можно использовать для принудительного ограничения внешнего ключа. index_name, если задано, используется, как описано ранее.
Да, Innodb
укажите это. Вы можете поместить имя внешнего ключа после предложения FOREIGN KEY
или оставить его, чтобы MySQL мог создать имя для вас. MySQL автоматически создает индекс с именем foreign_key_name
.
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
Невозможно автоматически получить индексный ключ
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
Название таблицы, которую вы создали, например, фотографии и FOREIGN KEY, например photograph_id
. Код должен выглядеть следующим образом:
ALTER TABLE photographs ADD INDEX (photograph_id);