Antworten:
Ja, aber nur am innodb. Innodb ist derzeit das einzige ausgelieferte Tabellenformat, in dem Fremdschlüssel implementiert sind.
Anscheinend wird automatisch ein Index erstellt, wie in dem Link angegeben, den Robert gepostet hat .
InnoDB benötigt Indizes für Fremdschlüssel und referenzierte Schlüssel, damit Fremdschlüsselprüfungen schnell durchgeführt werden können und kein Tabellenscan erforderlich ist. In der Referenzierungstabelle muss ein Index vorhanden sein, in dem die Fremdschlüsselspalten als erste Spalten in derselben Reihenfolge aufgeführt sind. Ein solcher Index wird automatisch für die Referenzierungstabelle erstellt, wenn er nicht vorhanden ist. (Dies steht im Gegensatz zu einigen älteren Versionen, in denen Indizes explizit erstellt werden mussten oder die Erstellung von Fremdschlüsseleinschränkungen fehlschlagen würde.) Indexname wird, falls angegeben, wie zuvor beschrieben verwendet.
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.
Ja, siehe InnoDB- und FOREIGN KEY-Einschränkungen .
Sie erhalten den Index nicht automatisch, wenn Sie eine ALTER TABLE (anstelle von CREATE TABLE) ausführen, zumindest gemäß den Dokumenten (der Link ist für 5.1, aber für 5.5 ist er der gleiche):
[...] Wenn Sie einer Tabelle mit ALTER TABLE eine Fremdschlüsseleinschränkung hinzufügen, müssen Sie zuerst die erforderlichen Indizes erstellen.
Für diejenigen, die ein Zitat aus 5.7
Dokumenten suchen :
MySQL erfordert Indizes für Fremdschlüssel und referenzierte Schlüssel, damit Fremdschlüsselprüfungen schnell durchgeführt werden können und kein Tabellenscan erforderlich ist. In der Referenzierungstabelle muss ein Index vorhanden sein, in dem die Fremdschlüsselspalten als erste Spalten in derselben Reihenfolge aufgeführt sind. Ein solcher Index wird automatisch für die Referenzierungstabelle erstellt, wenn er nicht vorhanden ist. Dieser Index wird möglicherweise später stillschweigend gelöscht, wenn Sie einen anderen Index erstellen, mit dem die Fremdschlüsseleinschränkung erzwungen werden kann. Der angegebene Indexname wird, falls angegeben, wie zuvor beschrieben verwendet.
Wie gesagt für InnoDB. Zuerst fand ich es seltsam, dass viele andere (insbesondere MS SQL und DB2) dies nicht tun. TableSpace-Scans sind nur dann besser als Index-Scans, wenn nur sehr wenige Tabellenzeilen vorhanden sind. In den allermeisten Fällen möchte ein Fremdschlüssel indiziert werden. Dann hat es mich irgendwie getroffen - das bedeutet nicht unbedingt, dass es ein eigenständiger (einspaltiger) Index sein muss - wo er sich im automatischen FK-Index von MySQL befindet. Vielleicht ist dies der Grund, warum MS SQL, DB2 (Oracle, bei dem ich mir nicht sicher bin) usw. es dem DBA überlassen. Immerhin können mehrere Indizes für große Tabellen Probleme mit der Leistung und dem Speicherplatz verursachen.
Ja, Innodb
geben Sie dies an. Sie können einen Fremdschlüsselnamen nach der FOREIGN KEY
Klausel einfügen oder MySQL einen Namen für Sie erstellen lassen. MySQL erstellt automatisch einen Index mit dem foreign_key_name
Namen.
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
Es ist nicht möglich, den Indexschlüssel automatisch zu verwenden
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
Name der Tabelle, die Sie zum Beispiel Fotos und zum Beispiel FOREIGN KEY erstellt haben photograph_id
. Der Code sollte so sein
ALTER TABLE photographs ADD INDEX (photograph_id);