Индексирует ли MySQL столбцы внешнего ключа автоматически? - PullRequest
225 голосов
/ 20 ноября 2008

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

Ответы [ 8 ]

195 голосов
/ 20 ноября 2008

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

117 голосов
/ 17 июля 2009

Очевидно, индекс создается автоматически, как указано в ссылка, которую Роберт опубликовал .

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

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

21 голосов
/ 20 ноября 2008
11 голосов
/ 08 февраля 2013

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

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

4 голосов
/ 25 июля 2017

Для тех, кто ищет цитаты из 5.7 документов :

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

4 голосов
/ 29 июня 2010

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

2 голосов
/ 24 ноября 2015

Да, 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
0 голосов
/ 24 декабря 2015

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

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

Имя таблицы, которую вы создали, например, фотографии и КЛЮЧ ВНЕШНЯЯ, например photograph_id. Код должен быть таким

ALTER TABLE photographs ADD INDEX (photograph_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...