Автоматически ли индексирует столбцы внешнего ключа MySQL?
Автоматически ли индексирует столбцы внешнего ключа MySQL?
Ответ 1
Да, но только на Innodb. Innodb является единственным в настоящее время отправленным табличным форматом, в котором реализованы внешние ключи.
Ответ 2
По-видимому, индекс создается автоматически, как указано в ссылка robert опубликовала.
InnoDB требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы. В таблице ссылок должен быть индекс, в котором столбцы внешнего ключа перечислены в качестве первых столбцов в том же порядке. Такой индекс создается в таблице ссылок автоматически, если он не существует. (Это противоречит некоторым более старым версиям, в которых индексы должны были быть созданы явно или создание ограничений внешнего ключа не получилось.) index_name, если задано, используется, как описано ранее.
Ответ 3
Да, см. Ограничения 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);