it-swarm.com.de

Indiziert MySQL Fremdschlüsselspalten automatisch?

Indiziert MySQL Fremdschlüsselspalten automatisch?

227
Dónal

Ja, aber nur am innodb . Innodb ist derzeit das einzige ausgelieferte Tabellenformat, in dem Fremdschlüssel implementiert sind.

198
Grant Limberg

Anscheinend wird automatisch ein Index erstellt, wie in der Link, den Robert gepostet hat angegeben.

InnoDB benötigt Indizes zu Fremdschlüsseln und referenzierten Schlüsseln, damit Fremdschlüsselprüfungen schnell und ohne Tabellenscan durchgeführt werden können. 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 vorhanden sein mussten wird explizit erstellt, oder die Erstellung von Fremdschlüsseleinschränkungen schlägt fehl.) index_name wird, sofern angegeben, wie zuvor beschrieben verwendet.

InnoDB und FOREIGN KEY Constraints

117
Mr Alexander
21
Robert Gamble

Sie erhalten den Index nicht automatisch, wenn Sie eine ALTER TABLE (anstelle von CREATE TABLE) ausführen, zumindest gemäß the docs (der Link ist für 5.1, aber für 5.5 derselbe):

[...] Wenn Sie einer Tabelle mit ALTER TABLE eine Fremdschlüsseleinschränkung hinzufügen, müssen Sie zunächst die erforderlichen Indizes erstellen.

11

Wie gesagt für InnoDB. Anfangs 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 es 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. dem DBA überlassen bleiben. Immerhin können mehrere Indizes für große Tabellen Probleme mit der Leistung und dem Speicherplatz verursachen.

4
Wolf5370

Für diejenigen, die ein Zitat aus 5.7docs suchen:

MySQL benötigt Indizes für Fremdschlüssel und Schlüssel, auf die verwiesen wird, damit Fremdschlüssel schnell überprüft 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 für die Referenzierungstabelle automatisch 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. index_name wird, falls angegeben, wie zuvor beschrieben verwendet.

4
Fahmi

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 Namen foreign_key_name.

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
2
Navrattan Yadav