473 Stimmen

Wird durch einen Fremdschlüssel automatisch ein Index erstellt?

Mir wurde gesagt, dass SQL Server so etwas wie einen Index in der untergeordneten Tabelle erstellt, wenn ich zwei Tabellen als Fremdschlüssel verwende. Es fällt mir schwer zu glauben, dass dies wahr ist, aber ich kann nicht viel finden, was sich speziell auf dieses Thema bezieht.

Der eigentliche Grund für meine Frage ist, dass wir bei einer Löschanweisung für eine Tabelle, die wahrscheinlich 15 Bezugstabellen hat, eine sehr langsame Antwortzeit haben. Ich habe unseren Datenbankspezialisten gefragt, und er sagt, wenn es einen Fremdschlüssel für die Felder gibt, dann wirkt er wie ein Index. Welche Erfahrungen haben Sie damit gemacht? Sollte ich Indizes für alle Fremdschlüsselfelder hinzufügen oder sind sie nur unnötiger Overhead?

8voto

Andomar Punkte 224164

Nehmen wir an, Sie haben eine große Tabelle namens Aufträge und eine kleine Tabelle namens Kunden. Es gibt einen Fremdschlüssel von einer Bestellung zu einem Kunden. Wenn Sie nun einen Kunden löschen, muss Sql Server prüfen, ob es keine verwaisten Aufträge gibt; falls doch, wird ein Fehler ausgegeben.

Um zu prüfen, ob es Bestellungen gibt, muss Sql Server die große Tabelle Bestellungen durchsuchen. Wenn es einen Index gibt, wird die Suche schnell sein, wenn nicht, wird sie langsam sein.

In diesem Fall könnte das langsame Löschen also durch das Fehlen eines Indexes erklärt werden. Insbesondere wenn Sql Server 15 große Tabellen ohne Index durchsuchen müsste.

P.S. Wenn der Fremdschlüssel ON DELETE CASCADE hat, muss Sql Server immer noch die Auftragstabelle durchsuchen, aber dann alle Aufträge entfernen, die auf den gelöschten Kunden verweisen.

7voto

Paul Sonier Punkte 37609

SQL Server erstellt automatisch Indizes für Primärschlüssel, aber nicht für Fremdschlüssel. Erstellen Sie den Index für die Fremdschlüssel. Der Overhead lohnt sich wahrscheinlich.

5voto

Es kommt darauf an. Bei MySQL wird ein Index erstellt, wenn Sie ihn nicht selbst erstellen:

MySQL verlangt, dass Fremdschlüsselspalten indiziert sind. Wenn Sie eine Tabelle mit einer Fremdschlüssel-Beschränkung, aber ohne Index für eine bestimmte Spalte erstellen, wird ein Index erzeugt.

Quelle: https://dev.mysql.com/doc/refman/8.0/en/constraint-foreign-key.html

Dasselbe gilt eh für MySQL 5.6.

4voto

shylent Punkte 9956

Streng genommen haben Fremdschlüssel absolut nichts mit Indizes zu tun, ja. Aber, wie meine Vorredner schon sagten, ist es sinnvoll, einen zu erstellen, um die FK-Suche zu beschleunigen. Wenn Sie in MySQL keinen Index in Ihrer FK-Deklaration angeben, legt die Engine (InnoDB) ihn automatisch für Sie an.

3voto

Gandalf Punkte 9365

Meines Wissens nicht. Ein Fremdschlüssel fügt lediglich die Einschränkung hinzu, dass der Wert im untergeordneten Schlüssel auch irgendwo in der übergeordneten Spalte enthalten sein muss. Er teilt der Datenbank nicht mit, dass der untergeordnete Schlüssel auch indiziert sein muss, sondern nur eine Einschränkung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X