Відповіді:
Так, але тільки на innodb. На даний момент Innodb - це єдиний відвантажений формат таблиці, на якому реалізовані зовнішні ключі.
Мабуть, індекс створюється автоматично, як зазначено у посиланні, який опублікував Роберт .
InnoDB вимагає індексів зовнішніх ключів та посилальних ключів, щоб перевірка зовнішніх ключів була швидкою і не потребувала сканування таблиці. У таблиці посилань повинен бути індекс, де стовпці із зовнішнім ключем вказані як перші стовпці в тому ж порядку. Такий індекс створюється в референтній таблиці автоматично, якщо його не існує. (Це на відміну від деяких старих версій, в яких індекси повинні були бути створені явно або створення обмежень іноземних ключів не вдалося б.) Ім'я_індексу, якщо воно вказане, використовується як описано раніше.
InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
Так, див . Обмеження InnoDB та FOREIGN KEY .
Ви не отримуєте індекс автоматично, якщо ви робите ALTER TABLE (замість CREATE TABLE), принаймні згідно з документами (посилання для 5.1, але це те саме для 5.5):
[...] Коли ви додаєте обмеження іноземного ключа до таблиці за допомогою ALTER TABLE, не забудьте спершу створити необхідні індекси.
Для тих, хто шукає цитату з 5.7
документів :
MySQL вимагає індексів зовнішніх ключів та посилальних ключів, щоб перевірка зовнішніх ключів була швидкою і не потребувала сканування таблиці. У таблиці посилань повинен бути індекс, де стовпці із зовнішнім ключем вказані як перші стовпці в тому ж порядку. Такий індекс створюється в референтній таблиці автоматично, якщо його не існує. Цей індекс пізніше може бути беззвучно скинутий, якщо ви створите інший індекс, який можна використовувати для забезпечення обмеження зовнішнього ключа. index_name, якщо вказано, використовується як описано раніше.
Як зазначено, це робиться для InnoDB. Спочатку я подумав, що це дивно, що багато інших (зокрема MS SQL та DB2) цього не роблять. Сканування TableSpace краще лише, ніж індексне сканування, коли таблиць рядків дуже мало - тому в переважній більшості випадків іноземний ключ хочеться проіндексувати. Тоді мене це наче вдарило - це не обов'язково означає, що він повинен бути окремим індексом (в одному стовпчику) - там, де він знаходиться в автоматичному індексі FK MySQL. Отож, можливо, це є причиною того, що MS SQL, DB2 (Oracle я не впевнений у тому) і т. Д. Залишають це до DBA; адже всі численні індекси на великих таблицях можуть спричинити проблеми з продуктивністю та простором.
Так, 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);