it-swarm.com.de

Unterschiede zwischen INDEX, PRIMARY, UNIQUE, FULLTEXT in MySQL?

Was sind die Unterschiede zwischen PRIMARY, UNIQUE, INDEX und FULLTEXT beim Erstellen von MySQL-Tabellen?

Wie würde ich sie benutzen?

577
Sam

Unterschiede

  • KEY oder INDEX bezieht sich auf einen normalen nicht eindeutigen Index. Nicht unterschiedliche Werte für den Index sind zulässig, daher kann der Index Zeilen mit identischen Werten in allen Spalten des Index enthalten . Diese Indizes erzwingen keine Einschränkungen für Ihre Daten, sodass sie nur verwendet werden, um sicherzustellen, dass bestimmte Abfragen schnell ausgeführt werden können.

  • UNIQUE bezieht sich auf einen Index, bei dem alle Zeilen des Index eindeutig sein müssen. Das heißt, die gleiche Zeile enthält möglicherweise nicht für alle Spalten in diesem Index dieselben Nicht-NULL-Werte wie eine andere Zeile. UNIQUE-Indizes werden nicht nur zur Beschleunigung von Abfragen verwendet, sondern können auch zum Erzwingen von Beschränkungen für Daten verwendet werden, da das Datenbanksystem nicht zulässt, dass diese Regel für eindeutige Werte beim Einfügen oder Aktualisieren von Daten verletzt wird.

    In Ihrem Datenbanksystem kann ein UNIQUE-Index auf Spalten angewendet werden, die NULL-Werte zulassen. In diesem Fall dürfen zwei Zeilen identisch sein, wenn beide einen NULL-Wert enthalten. Abhängig von Ihrer Anwendung ist dies jedoch möglicherweise unerwünscht . Wenn Sie dies verhindern möchten, sollten Sie NULL-Werte in den entsprechenden Spalten nicht zulassen.

  • PRIMARY verhält sich genauso wie ein UNIQUE-Index, nur dass er immer den Namen 'PRIMARY' trägt und sich möglicherweise nur einer in einer Tabelle befindet (und dort sollte immer eins sein, obwohl einige Datenbanksysteme dies nicht erzwingen. Ein PRIMARY-Index ist als primäres Mittel zur eindeutigen Identifizierung von Zeilen in der Tabelle gedacht. Daher sollte er im Gegensatz zu UNIQUE nicht für Spalten verwendet werden, die NULL-Werte zulassen. Ihr PRIMARY-Index sollte sich auf der kleinsten Anzahl von Spalten befinden, die ausreichen, um eine Zeile eindeutig zu identifizieren. Häufig ist dies nur eine Spalte mit einer eindeutigen, automatisch inkrementierten Nummer. Falls jedoch noch etwas anderes vorhanden ist, das eine Zeile eindeutig identifizieren kann, z. B. "Ländercode" in einer Liste von Ländern, können Sie dies stattdessen verwenden.

    Einige Datenbanksysteme (wie MySQLs InnoDB) speichern die Datensätze einer Tabelle in der Reihenfolge auf der Festplatte, in der sie im PRIMARY-Index erscheinen.

  • FULLTEXT Indizes unterscheiden sich von allen oben genannten und ihr Verhalten unterscheidet sich erheblich zwischen Datenbanksystemen. FULLTEXT-Indizes sind nur für die Volltextsuche mit der MATCH ()/AGAINST () -Klausel nützlich, im Gegensatz zu den drei oben genannten, die normalerweise intern mithilfe von B-Bäumen implementiert werden (Auswahl, Sortierung oder Bereiche ab der äußersten linken Spalte) oder Hash-Tabellen (Auswahl ab der Spalte ganz links möglich).

    Wo die anderen Indextypen für allgemeine Zwecke verwendet werden, ist ein FULLTEXT-Index dahingehend spezialisiert, dass er einem engen Zweck dient: Er wird nur für eine "Volltextsuche" verwendet.

Ähnlichkeiten

  • Alle diese Indizes können mehr als eine Spalte enthalten.

  • Mit Ausnahme von FULLTEXT ist die Spaltenreihenfolge von Bedeutung: Damit der Index in einer Abfrage nützlich ist, muss die Abfrage Spalten aus dem Index verwenden, die von links beginnen. Sie kann nicht nur den zweiten, dritten oder vierten Teil eines Befehls verwenden index, es sei denn, es werden auch die vorherigen Spalten im Index verwendet, um statische Werte abzugleichen. (Damit ein FULLTEXT-Index für eine Abfrage nützlich ist, muss die Abfrage alle Spalten des Index verwenden.)

638
thomasrutter

All dies sind Arten von Indizes.

primary: muss eindeutig sein, ist ein Index, ist (wahrscheinlich) der physikalische Index, kann nur einer pro Tabelle sein.

nique: wie es heißt. Sie können nicht mehr als eine Zeile mit einem Tupel dieses Werts haben. Da ein eindeutiger Schlüssel mehr als eine Spalte umfassen kann, bedeutet dies nicht unbedingt, dass jede einzelne Spalte im Index eindeutig ist, sondern dass jede Kombination von Werten in diesen Spalten eindeutig ist.

index: Wenn es nicht primär oder eindeutig ist, werden die in die Tabelle eingefügten Werte nicht eingeschränkt, aber sie können effizienter nachgeschlagen werden.

fulltext: eine speziellere Form der Indexierung, die die Volltextsuche ermöglicht. Stellen Sie sich vor, Sie erstellen (im Wesentlichen) einen "Index" für jedes "Wort" in der angegebenen Spalte.

145
tpdi

Ich habe das Gefühl, dass dies gut abgedeckt wurde, vielleicht mit Ausnahme der folgenden:

  • Einfache KEY/INDEX (oder anders als SECONDARY INDEX bezeichnet) erhöhen die Leistung, wenn die Selektivität ausreicht. In diesem Zusammenhang wird in der Regel empfohlen, dass der Index unwirksam wird, wenn die Anzahl der Datensätze in der Ergebnismenge, auf die ein Index angewendet wird, 20% der Gesamtanzahl der Datensätze der übergeordneten Tabelle überschreitet. In der Praxis wird jede Architektur anders sein, aber die Idee ist immer noch richtig.

  • Sekundärindizes (und das ist sehr spezifisch für MySQL) sollten nicht als vollständig separate und unterschiedliche Objekte vom Primärschlüssel angesehen werden. Tatsächlich sollten beide gemeinsam verwendet werden und, sobald diese Informationen bekannt sind, ein zusätzliches Tool für den mysql-DBA darstellen: In MySQL wird der Primärschlüssel in Indizes eingebettet. Dies führt zu erheblichen Leistungsverbesserungen, insbesondere beim cleveren Erstellen impliziter Abdeckungsindizes wie dort beschrieben

  • Wenn Sie der Meinung sind, dass Ihre Daten UNIQUE sein sollten, verwenden Sie einen eindeutigen Index. Sie können sich vorstellen, dass dies optional ist (zum Beispiel auf Anwendungsebene) und dass ein normaler Index ausreicht, aber es stellt tatsächlich eine Garantie für Mysql dar, dass jede Zeile einzigartig ist, was im Übrigen einen Leistungsvorteil darstellt.

  • Sie können FULLTEXT (oder auf andere Weise SEARCH INDEX genannt) nur mit Innodb (In MySQL 5.6.4 und höher) und Myisam Engines verwenden

  • Sie können FULLTEXT nur für die Spaltentypen CHAR, VARCHAR und TEXT verwenden
  • FULLTEXT Index beinhaltet viel mehr als nur die Erstellung eines Index. Es wurden eine Reihe von Systemtabellen erstellt, ein vollständig separates Caching-System und einige spezifische Regeln und Optimierungen angewendet. Siehe http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html und http://dev.mysql.com/doc/refman/ 5.7/de/innodb-fulltext-index.html
16
Sebas