Автоматически ли индексирует столбцы внешнего ключа MySQL?

Автоматически ли индексирует столбцы внешнего ключа MySQL?

Ответ 1

Да, но только на Innodb. Innodb является единственным в настоящее время отправленным табличным форматом, в котором реализованы внешние ключи.

Ответ 2

По-видимому, индекс создается автоматически, как указано в ссылка robert опубликовала.

InnoDB требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы. В таблице ссылок должен быть индекс, в котором столбцы внешнего ключа перечислены в качестве первых столбцов в том же порядке. Такой индекс создается в таблице ссылок автоматически, если он не существует. (Это противоречит некоторым более старым версиям, в которых индексы должны были быть созданы явно или создание ограничений внешнего ключа не получилось.) index_name, если задано, используется, как описано ранее.

Ограничения InnoDB и FOREIGN KEY

Ответ 4

Вы не получите индекс автоматически, если вы используете ALTER TABLE (вместо CREATE TABLE), по крайней мере, согласно документам (ссылка предназначена для 5.1 но это то же самое для 5.5):

[...] Когда вы добавляете ограничение внешнего ключа в таблицу с помощью ALTER TABLE, не забудьте сначала создать необходимые индексы.

Ответ 5

Как указано, это относится к InnoDB. Сначала мне показалось странным, что многие другие (в частности, MS SQL и DB2) этого не делают. Сканирование табличного пространства лучше, чем сканирование индексов, когда очень мало строк таблицы, поэтому в подавляющем большинстве случаев иностранный ключ хотел бы проиндексировать. Тогда это меня поразило - это не обязательно означает, что это должен быть отдельный (один столбец) индекс - где он находится в автоматическом индексе FK MySQL. Таким образом, возможно, именно по этой причине MS SQL, DB2 (Oracle я не уверен) и т.д. Оставляют это до DBA; после того как все несколько индексов на больших таблицах могут вызвать проблемы с производительностью и пространством.

Ответ 6

Для тех, кто ищет цитату из 5.7 docs:

MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешнего ключа могут быть быстрыми и не требуют сканирования таблицы. в таблицы ссылок, должен быть индекс, где внешний ключ столбцы перечисляются в качестве первых столбцов в том же порядке. Такой индекс создается в справочной таблице автоматически, если он не существовать. Этот индекс можно было бы отключить позже, если вы создадите другой индекс, который можно использовать для принудительного ограничения внешнего ключа. index_name, если задано, используется, как описано ранее.

Ответ 7

Да, 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

Ответ 8

Невозможно автоматически получить индексный ключ

ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)

Название таблицы, которую вы создали, например, фотографии и FOREIGN KEY, например photograph_id. Код должен выглядеть следующим образом:

ALTER TABLE photographs ADD INDEX (photograph_id);