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

609

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

Wie würde ich sie verwenden?

Brian Tompsett - 汤 莱恩
quelle
3
Auch für alle, die neugierig sind auf SPATIAL: stackoverflow.com/questions/2256364/…
Leo
Einen Vergleich eines primären mit einem sekundären Index in Python finden Sie in diesem Beitrag stackoverflow.com/questions/59918440/secondary-index-in-python
Athanassios

Antworten:

674

Unterschiede

  • KEY oder INDEX bezieht sich auf einen normalen nicht eindeutigen Index. Nicht verschiedene Werte für den Index sind erlaubt, so dass der Index kann Reihen mit identischen Werten in allen Spalten des Index enthält. Diese Indizes erzwingen keine Einschränkungen für Ihre Daten, sodass sie nur für den Zugriff verwendet werden - um schnell bestimmte Datensatzbereiche zu erreichen, ohne alle Datensätze zu scannen.

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

    Ihr Datenbanksystem kann zulassen, dass ein EINZIGARTIGER Index auf Spalten angewendet wird, die NULL-Werte zulassen. In diesem Fall dürfen zwei Zeilen identisch sein, wenn beide einen NULL-Wert enthalten (der Grund hierfür ist, dass NULL als nicht gleich sich selbst betrachtet wird). Abhängig von Ihrer Anwendung kann dies jedoch unerwünscht sein: Wenn Sie dies verhindern möchten, sollten Sie NULL-Werte in den entsprechenden Spalten nicht zulassen.

  • PRIMARY verhält sich genau wie ein EINZIGARTIGER Index, außer dass er immer den Namen 'PRIMARY' trägt und möglicherweise nur einen in einer Tabelle enthält (und es sollte immer einen geben, obwohl einige Datenbanksysteme dies nicht erzwingen). Ein PRIMARY-Index ist als primäres Mittel zur eindeutigen Identifizierung einer Zeile 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. Oft ist dies nur eine Spalte, die eine eindeutige automatisch inkrementierte Nummer enthält. Wenn jedoch eine andere Zeile eindeutig identifiziert werden kann, z. B. "Ländercode" in einer Liste von Ländern, können Sie diese stattdessen verwenden.

    Einige Datenbanksysteme (wie z. B. InnoDB von MySQL) speichern die Datensätze einer Tabelle in der Reihenfolge auf der Festplatte, in der sie im PRIMARY-Index angezeigt werden.

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

    Wenn die anderen Indextypen universell einsetzbar sind, ist ein FULLTEXT-Index insofern spezialisiert, als 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 von 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.)

thomasrutter
quelle
2
Bedeutet dies, dass ein FULLTEXT-Index im Wesentlichen nutzlos und ein Leerzeichen ist, wenn Sie MATCH () / AGAINST () nicht in Ihren Abfragen verwenden?
user1397417
5
Ja. Es wird auch nur für MyISAM-Datenbanken unter MySQL verwendet, nicht für InnoDB. Andere Datenbankserver verfügen möglicherweise über gleichwertige Funktionen, die möglicherweise anders funktionieren.
Thomasrutter
"Es sollte nicht für Spalten verwendet werden, die NULL-Werte zulassen" -> Dies sollte "Kann nicht verwendet werden" sein. Primärschlüssel sind unbedingt NOT NULL. MySQL meldet, show columnsdass ein eindeutiger Nicht-NULL-Schlüssel ein Primärschlüssel ist, wenn keine anderen Primärschlüssel definiert sind.
Gordon Linoff
1
Das Grundprinzip hier ist, dass NULL als nicht gleich sich selbst betrachtet wird. Lol ich werde das nicht vergessen
Hos Mercury
2
@ Thomasrutter MySQL unterstützt FULLTEXT in InnoDB ab Version 5.6
Marek Skiba
151

All dies sind Arten von Indizes.

primär: muss eindeutig sein, ist ein Index, ist (wahrscheinlich) der physische Index, kann nur einer pro Tabelle sein.

einzigartig: 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 Wertekombination 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 es wird ermöglicht, sie effizienter nachzuschlagen.

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

tpdi
quelle
32
Primärdaten können in MySQL (und vielen anderen DBs) zusammengesetzt sein, dh mit mehreren Schlüsseln. Sie sind nur ein spezieller Index. Unique ist nicht wirklich ein Index, sondern eine Einschränkung (für deren Durchsetzung ein Index in angemessener Zeit erforderlich ist, sodass ein Index erstellt wird).
MBCook
19

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

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

  • Sekundärindizes (und das ist sehr spezifisch für MySQL) sollten nicht als vollständig vom Primärschlüssel getrennte und unterschiedliche Objekte angesehen werden. Tatsächlich sollten beide gemeinsam verwendet werden und, sobald diese Informationen bekannt sind, ein zusätzliches Tool für den MySQL-DBA bereitstellen: In MySQL binden Indizes den Primärschlüssel ein. Dies führt zu erheblichen Leistungsverbesserungen, insbesondere wenn clever implizite Abdeckungsindizes wie die dort beschriebenen erstellt werden

  • Wenn Sie der Meinung sind, dass Ihre Daten es sein sollten UNIQUE, verwenden Sie einen eindeutigen Index. Sie denken vielleicht, dass dies optional ist (z. B. auf Anwendungsebene) und dass ein normaler Index ausreicht, aber es stellt tatsächlich eine Garantie für MySQL dar, dass jede Zeile eindeutig ist, was im Übrigen einen Leistungsvorteil bietet.

  • Sie können nur mit Innodb (in MySQL 5.6.4 und höher) und Myisam Engines verwenden FULLTEXT(oder anders genannt SEARCH INDEX)

  • Sie können nur verwenden , FULLTEXTauf CHAR, VARCHARund TEXTSpaltentypen
  • FULLTEXTIndex beinhaltet viel mehr als nur das Erstellen eines Index. Es werden 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/en/innodb-fulltext-index.html
Sebas
quelle