Индексирует ли MySQL столбцы внешнего ключа автоматически?
Индексирует ли MySQL столбцы внешнего ключа автоматически?
10 ответов
Да, но только на innodb. В настоящее время Innodb является единственным форматом таблицы, в котором реализованы внешние ключи.
Очевидно, индекс создается автоматически, как указано в ссылке, которую опубликовал Роберт.
InnoDB требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. Такой индекс создается в ссылочной таблице автоматически, если он не существует. (Это в отличие от некоторых более старых версий, в которых индексы должны были создаваться явно, иначе создание ограничений внешнего ключа завершилось бы неудачей.) Index_name, если задано, используется, как описано ранее.
Для тех, кто ищет цитату из 5.7
документы:
MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. Такой индекс создается в ссылочной таблице автоматически, если он не существует. Этот индекс может быть автоматически удален позже, если вы создадите другой индекс, который можно будет использовать для применения ограничения внешнего ключа. index_name, если дано, используется, как описано ранее.
Вы не получите индекс автоматически, если вы выполните ALTER TABLE (вместо CREATE TABLE), по крайней мере, в соответствии с документацией (ссылка для 5.1, но то же самое для 5.5):
[...] Когда вы добавляете ограничение внешнего ключа в таблицу с помощью ALTER TABLE, не забудьте сначала создать необходимые индексы.
Как указано, это относится к InnoDB. Сначала мне показалось странным, что многие другие (в частности, MS SQL и DB2) этого не делают. Сканирование табличного пространства лучше, чем сканирование по индексу, когда строк таблицы очень мало - поэтому в подавляющем большинстве случаев внешний ключ может быть проиндексирован. Тогда это как бы меня поразило - это не обязательно означает, что это должен быть отдельный (один столбец) индекс - там, где он находится в автоматическом FK-индексе MySQL. Возможно, именно поэтому MS SQL, DB2 (в Oracle я не уверен) и т. Д. Оставляют это на усмотрение администратора баз данных; Ведь множественные индексы в больших таблицах могут вызвать проблемы с производительностью и пространством.
Да, 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
Да, MySQL автоматически создаст индекс для столбца внешнего ключа, когда вы определяете ограничение внешнего ключа. И если у вас уже есть индекс, определенный для столбцов внешнего ключа, MySQL не будет создавать новый индекс. Вместо этого он будет использовать существующий индекс для обеспечения соблюдения ограничения внешнего ключа.
Да, внешний ключ индекса Mysql автоматически создается при создании таблицы с внешним ключом для другой таблицы.
Невозможно получить ключ индекса автоматически использовать
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
Название таблицы, которую вы создали, например, фотографии и КЛЮЧЕВОЙ КЛЮЧ, например photograph_id
, Код должен быть таким
ALTER TABLE photographs ADD INDEX (photograph_id);