Was ist ein Index in SQL?

439

Was ist ein Index in SQL? Können Sie erklären oder verweisen, um klar zu verstehen?

Wo soll ich einen Index verwenden?

Surya sasidhar
quelle

Antworten:

376

Ein Index wird verwendet, um die Suche in der Datenbank zu beschleunigen. MySQL verfügt über eine gute Dokumentation zu diesem Thema (die auch für andere SQL Server relevant ist): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Ein Index kann verwendet werden, um alle Zeilen, die mit einer Spalte in Ihrer Abfrage übereinstimmen, effizient zu finden und dann nur diese Teilmenge der Tabelle zu durchlaufen, um genaue Übereinstimmungen zu finden. Wenn Sie keine Indizes für eine Spalte in der WHEREKlausel haben, muss der SQLServer die gesamte Tabelle durchlaufen und jede Zeile überprüfen, um festzustellen, ob sie übereinstimmt. Dies kann bei großen Tabellen eine langsame Operation sein.

Der Index kann auch ein UNIQUEIndex sein, dh, Sie können keine doppelten Werte in dieser Spalte haben, oder ein Index, der PRIMARY KEYin einigen Speicher-Engines definiert, wo in der Datenbankdatei der Wert gespeichert ist.

In MySQL können Sie EXPLAINvor Ihrer SELECTAnweisung verwenden, um festzustellen, ob Ihre Abfrage einen Index verwendet. Dies ist ein guter Anfang für die Fehlerbehebung bei Leistungsproblemen. Lesen Sie hier mehr: http://dev.mysql.com/doc/refman/5.0/en/explain.html

Emil Vikström
quelle
"Der Index kann auch ein EINZIGARTIGER Index sein ..." Bedeutet das nur, dass der Index nicht EINZIGARTIG sein kann? Ich dachte immer, es ist EINZIGARTIG. Ich bin ziemlich neu in SQL, entschuldigen Sie
Daniel Kurniadi
@ DanielKurniadi Die meisten Indizes sind nicht eindeutig. Ich habe möglicherweise eine Benutzerdatenbank und möchte nach allen fragen, die in Göteborg leben. Ein Index im Feld "Stadt" würde meine Abfrage beschleunigen. In Göteborg leben jedoch mehr als ein Benutzer, sodass der Index nicht eindeutig sein darf.
Emil Vikström
174

Ein Clustered-Index entspricht dem Inhalt eines Telefonbuchs. Sie können das Buch bei 'Hilditch, David' öffnen und alle Informationen für alle 'Hilditch's direkt nebeneinander finden. Hier sind die Schlüssel für den Clustered-Index (Nachname, Vorname).

Dadurch eignen sich Clustered-Indizes hervorragend zum Abrufen vieler Daten basierend auf bereichsbezogenen Abfragen, da sich alle Daten nebeneinander befinden.

Da der Clustered-Index tatsächlich damit zusammenhängt, wie die Daten gespeichert werden, ist nur einer pro Tabelle möglich (obwohl Sie betrügen können, um mehrere Clustered-Indizes zu simulieren).

Ein nicht gruppierter Index unterscheidet sich darin, dass Sie viele davon haben können und diese dann auf die Daten im gruppierten Index verweisen. Sie könnten z. B. einen nicht gruppierten Index auf der Rückseite eines Telefonbuchs haben, auf dem (Stadt, Adresse) verschlüsselt ist.

Stellen Sie sich vor, Sie müssten im Telefonbuch nach allen Personen suchen, die in 'London' leben. Mit nur dem Clustered-Index müssten Sie jedes einzelne Element im Telefonbuch durchsuchen, da der Schlüssel im Clustered-Index aktiviert ist (Nachname, Vorname) und infolgedessen sind die in London lebenden Personen zufällig über den Index verteilt.

Wenn Sie einen nicht gruppierten Index für (Stadt) haben, können diese Abfragen viel schneller ausgeführt werden.

Ich hoffe, das hilft!

Dave Hilditch
quelle
151

Eine sehr gute Analogie besteht darin, sich einen Datenbankindex als Index in einem Buch vorzustellen. Wenn Sie ein Buch über Länder haben und nach Indien suchen, warum sollten Sie dann das gesamte Buch durchblättern - was einem vollständigen Tabellenscan in der Datenbankterminologie entspricht -, wenn Sie einfach zum Index auf der Rückseite von gehen können Buch, das Ihnen die genauen Seiten sagt, auf denen Sie Informationen über Indien finden können. Da ein Buchindex eine Seitenzahl enthält, enthält ein Datenbankindex einen Zeiger auf die Zeile, die den Wert enthält, nach dem Sie in Ihrem SQL suchen.

Mehr hier

Arun Kumar M.
quelle
2
Ich bewundere die erfahrenen Leute, die Dinge mit "Analogien" erklären. +1
snr
82

Ein Index wird verwendet, um die Leistung von Abfragen zu beschleunigen. Dazu wird die Anzahl der Datenbankdatenseiten reduziert, die besucht / gescannt werden müssen.

In SQL Server bestimmt ein Clustered- Index die physische Reihenfolge der Daten in einer Tabelle. Es kann nur einen Clustered-Index pro Tabelle geben (der Clustered-Index ist die Tabelle). Alle anderen Indizes in einer Tabelle werden als nicht gruppiert bezeichnet.

Mitch Wheat
quelle
49

Bei Indizes geht es darum, Daten schnell zu finden .

Indizes in einer Datenbank sind analog zu Indizes, die Sie in einem Buch finden. Wenn ein Buch einen Index hat und ich Sie bitte, ein Kapitel in diesem Buch zu finden, können Sie dies mithilfe des Index schnell finden. Wenn das Buch jedoch keinen Index hat, müssen Sie mehr Zeit damit verbringen, nach dem Kapitel zu suchen, indem Sie jede Seite vom Anfang bis zum Ende des Buches betrachten.

In ähnlicher Weise können Indizes in einer Datenbank Abfragen dabei helfen, Daten schnell zu finden. Wenn Sie mit Indizes noch nicht vertraut sind, können die folgenden Videos sehr nützlich sein. Tatsächlich habe ich viel von ihnen gelernt.

Indexgrundlagen
Clustered- und Non-Clustered-Indizes
Eindeutige und nicht eindeutige Indizes
Vor- und Nachteile von Indizes

Suresh
quelle
Als ich alle Antworten las, fragte ich mich, warum ich nicht alles indizieren sollte. +1 für die Aufnahme des Links mit den Nachteilen.
Lakshay Garg
@LakshayGarg Manchmal kann eine unnötige Indizierung auch die Ausführungszeit der Abfrage verlangsamen, daher sollten wir nicht versuchen, alles zu indizieren. So wie alles seine eigenen Vor- und Nachteile hat.
Gaurav Rajdeo
@ LakshayGarg Gaurav Rajdeo ist richtig. Um die gleiche Analogie beizubehalten: Möglicherweise möchten Sie jedes Kapitel, jede Abbildung oder Tabelle in einem Buch indizieren, aber nicht jeden Absatz, Satz oder jedes Wort. Normalerweise wäre das ein Overkill und würde zu unnötigen Komplikationen führen. Hoffe, dass dies nah genug am gezeichneten Bild in dieser Antwort ist.
Colidyre
23

Nun im Allgemeinen ist Index ein B-tree. Es gibt zwei Arten von Indizes: Clustered und Nonclustered.

Der Clustered- Index erstellt eine physische Reihenfolge von Zeilen (es kann nur eine sein, und in den meisten Fällen handelt es sich auch um einen Primärschlüssel. Wenn Sie einen Primärschlüssel für eine Tabelle erstellen, erstellen Sie auch einen Clustered-Index für diese Tabelle).

Nicht gruppiert Index ist ebenfalls ein Binärbaum, erstellt jedoch keine physische Reihenfolge der Zeilen. Die Blattknoten des nicht gruppierten Index enthalten also PK (falls vorhanden) oder Zeilenindex.

Indizes werden verwendet, um die Suchgeschwindigkeit zu erhöhen. Weil die Komplexität von O (log N) ist. Indizes ist ein sehr großes und interessantes Thema. Ich kann sagen, dass das Erstellen von Indizes für große Datenbanken manchmal eine Art Kunst ist.

Stimme
quelle
6
Im Allgemeinen ist es eher ein B-Baum als ein Binärbaum.
Mitch Wheat
Da Indizes selbstausgleichende Bäume verwenden, gleicht sich jedes Mal, wenn Sie eine Zeile hinzufügen / löschen, diese selbst aus - was das Einfügen / Löschen teurer macht ... richtig?
David Refaeli
20

INDEXES - um Daten leicht zu finden

UNIQUE INDEX - Doppelte Werte sind nicht zulässig

Syntax für INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

Syntax für UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
RAGU
quelle
13

Zuerst müssen wir verstehen, wie normale (ohne Indizierung) Abfragen ausgeführt werden. Grundsätzlich werden alle Zeilen einzeln durchlaufen, und wenn die gefundenen Daten gefunden werden. Siehe folgendes Bild. (Dieses Bild wurde aus diesem Video aufgenommen .)

Ohne Indizierung Angenommen, die Abfrage soll 50 finden, dann müssen 49 Datensätze als lineare Suche gelesen werden.

Siehe folgendes Bild. (Dieses Bild wurde aus diesem Video aufgenommen )

Geben Sie hier die Bildbeschreibung ein

Wenn wir die Indizierung anwenden, findet die Abfrage die Daten schnell heraus, ohne sie zu lesen, indem nur die Hälfte der Daten in jeder Durchquerung wie bei einer binären Suche entfernt wird. Die MySQL-Indizes werden als B-Baum gespeichert, wobei sich alle Daten im Blattknoten befinden.

Kravi
quelle
12

INDEX ist eine Technik zur Leistungsoptimierung, die den Datenabruf beschleunigt. Es handelt sich um eine persistente Datenstruktur, die einer Tabelle (oder Ansicht) zugeordnet ist, um die Leistung beim Abrufen der Daten aus dieser Tabelle (oder Ansicht) zu erhöhen.

Die indexbasierte Suche wird insbesondere angewendet, wenn Ihre Abfragen den WHERE-Filter enthalten. Andernfalls wählt eine Abfrage ohne WHERE-Filter ganze Daten und Prozesse aus. Das Durchsuchen der gesamten Tabelle ohne INDEX wird als Tabellenscan bezeichnet.

Genaue Informationen zu SQL-Indizes finden Sie klar und zuverlässig: Folgen Sie diesen Links:

  1. Zum Verständnis von Cocnept: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Zum Verständnis der Implementierung: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html
nayeemDotNetAuthorities
quelle
6

Ein Index wird aus verschiedenen Gründen verwendet. Der Hauptgrund besteht darin, die Abfrage zu beschleunigen, damit Sie Zeilen schneller abrufen oder sortieren können. Ein weiterer Grund besteht darin, einen Primärschlüssel oder einen eindeutigen Index zu definieren, der garantiert, dass keine anderen Spalten dieselben Werte haben.

Sinnvoll
quelle
6

Wenn Sie SQL Server verwenden, ist eine der besten Ressourcen das eigene Online-Buch, das mit der Installation geliefert wird! Dies ist der erste Platz, auf den ich mich bei allen SQL Server-bezogenen Themen beziehen würde.

Wenn es praktisch ist "Wie soll ich das machen?" Art von Fragen, dann wäre StackOverflow ein besserer Ort zu stellen.

Ich war auch schon eine Weile nicht mehr zurück, aber sqlservercentral.com war früher eine der Top-SQL Server-bezogenen Sites da draußen.

Klonschlange
quelle
0

Ein Index ist ein on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Ein Index enthält Schlüssel, die aus einer oder mehreren Spalten in der Tabelle oder Ansicht erstellt wurden. Diese Schlüssel werden in einer Struktur (B-Baum) gespeichert, die es SQL Server ermöglicht, die mit den Schlüsselwerten verknüpften Zeilen schnell und effizient zu finden.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Wenn Sie einen PRIMARY KEY konfigurieren, erstellt Database Engine automatisch einen Clustered-Index, sofern noch kein Clustered-Index vorhanden ist. Wenn Sie versuchen, eine PRIMARY KEY-Einschränkung für eine vorhandene Tabelle zu erzwingen und für diese Tabelle bereits ein Clustered-Index vorhanden ist, erzwingt SQL Server den Primärschlüssel mithilfe eines nicht gruppierten Index.

Weitere Informationen zu Indizes (gruppiert und nicht gruppiert) finden Sie hier: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view= sql-server-ver15

Hoffe das hilft!

adSad
quelle