Indizierung einer Datenbank

12

Ich kenne mich mit Datenbanken nicht so gut aus und versuche nun, den Indexierungsmechanismus zu verstehen.

Soweit ich weiß, beschleunigt die Indizierung einer Spalte in einem RDBMS die Suche nach dieser Spalte. Dies gilt auch für die Triple-Stores. Nur bei diesen Indizes wird davon ausgegangen, dass Sie (zum Beispiel) hauptsächlich nach dem Thema, dann nach dem Objekt usw. suchen.

Ich bin mir bei RDBMS nicht sicher, aber in Dreifachgeschäften können Sie mehr als einen Index definieren, sodass das Geschäft den besten Index für jede Abfrage auswählt (hoffentlich habe ich das richtig verstanden). Natürlich erscheint folgende Frage:

Warum sollte ich nicht alle möglichen Indizes zu einem Triple Store hinzufügen und auf ein RDBMS erweitern, warum nicht Indizes für jede Spalte erstellen (vorausgesetzt, ich bin nicht zu faul)?

Dragos
quelle

Antworten:

25

Ein Index ist im Wesentlichen eine zusätzliche Tabelle, bei der der Primärschlüssel das zu indizierende Feld und der einzige Inhalt der Primärschlüssel Ihrer Haupttabelle ist. Daher muss jedes Update in jedem Index repliziert werden, der das Feld verwendet, das Sie aktualisieren.

Dies macht sich insbesondere bei Inserts bemerkbar. Stellen Sie sich vor, Sie müssten jede Einfügung, die Sie an einer Tabelle vorgenommen haben, auf 20 andere Tabellen replizieren. Es wird schmerzlich langsam sein.

Beachten Sie, dass dies bei zusammengesetzten, gruppierten und Volltextindizes noch schlimmer wird, aber ich möchte das Problem noch nicht für Sie komplizieren.

pdr
quelle
2

Die Indizes sind grundsätzlich zusätzliche Datenstrukturen, die aufgebaut und gespeichert werden müssen. Durch das Erstellen von Independence wird CPU-Leistung (während Schreibvorgängen) verschwendet und durch das Speichern wird Festplattenkapazität verschwendet.

Warum sollten Sie Indizes erstellen und speichern, die Sie nie verwenden?

Matěj Zábský
quelle
Es ist eine rein theoretische Frage ("Was wäre wenn / warum nicht").
Dragos
@ Dragos Ich denke, die Antwort auf diese Frage ergibt sich aus meinem Beitrag: Wenn Sie dies tun, würde jeder Schreibvorgang viel langsamer und jeder Datensatz viel Festplattenkapazität verschwenden. Warum nicht? Weil CPU-Leistung und Festplattenspeicher teuer sind.
Matěj Zábský
2

Platzieren Sie Indizes nur bei Bedarf. Als Faustregel gilt, wenn ich ein Datenbankschema entwickle, erhält jede Tabelle zunächst einen PK-Primärschlüssel-Clustered-Index. Dies ist die eindeutige Kennung für Daten in dieser Tabelle. In kann eine oder mehrere Spalten enthalten.

Danach füge ich in der Regel nur eindeutige Non-Clustered-Indizes zu Spalten hinzu, für die ich die Eindeutigkeit erzwingen möchte.

Dies ist das Basisschema. Wenn die Anwendung entwickelt und ausgereift ist, fügen wir nach Bedarf Indizes hinzu, die auf Leistungsaspekten und der Art und Weise basieren, in der die Daten abgefragt werden.

Jeder hinzugefügte Index erhöht den verwendeten Abstand und fügt zusätzliche Wartung hinzu. Wählen Sie Ihre Indizes also mit Bedacht aus.

Jon Raynor
quelle
Beim Lesen Ihrer Antwort kam mir eine andere Frage in den Sinn: Werden Primärschlüssel normalerweise automatisch indiziert, oder muss ich mich selbst angeben, dass sie indiziert werden? Zum Beispiel in einer MySQL-Datenbank?
Dragos
Ja, ein Primärschlüssel sollte automatisch einen Clustered-Index für Ihren (SQL Server) erstellen. Nur ein Primärschlüssel, also nur ein Clustered-Index pro Tabelle. MySQL sollte ähnlich sein, aber vielleicht kann ein MySQL-Experte das validieren.
Jon Raynor
2

Die Stärke von Indizes besteht darin, dass sie 1) eine Datenstruktur sind, die schnell durchsucht werden kann, und 2) kompakter als die tatsächlichen Tabellen sind, sodass mehr Indexe in den Arbeitsspeicher passen, anstatt auf die Festplatte ausgelagert zu werden.

Wenn Sie für jede Spalte einen Index haben, benötigen die Indizes selbst mehr Platz als die von ihnen dargestellte Tabelle. Wenn die Datenbank wirklich alle Indizes verwendet, dauert es länger, sie nur in den Arbeitsspeicher und aus dem Arbeitsspeicher auszutauschen. Außerdem muss jeder Index bei Inertisierung, Aktualisierung oder Löschung aktualisiert werden.

Darüber hinaus sind Indizes für eine einzelne Spalte nicht einmal das Beste, was Sie tun können. Die meisten Beziehungsdatenbanken erlauben tatsächlich einen Index für mehrere Spalten, und die Reihenfolge dieser Spalten spielt eine Rolle. Wenn ich zum Beispiel eine Datenbank nach allen Personen durchsuchen möchte, die zwischen 1980 und 1984 aus Klassen zu Duke gegangen sind, dann möchte ich einen Index über (School, ClassYear). Die Abfrage könnte keinen Index mit denselben Spalten verwenden, jedoch umgekehrt.

Um also jeden möglichen Index zu erstellen , gibt es mindestens n! Möglichkeiten zum Anordnen von Spalten in einem Index. Mit nur 5 Spalten gibt es 120 mögliche Indizes.

Da es so viele mögliche Indizes gibt, müssen Sie wirklich feststellen, welche Indizes für Ihre Anwendung nützlich sind, und nur diese erstellen.

Chris Pitman
quelle
Aber wären in Ihrem Beispiel zwei Indizes nützlich: einer für School und einer für ClassYear?
Dragos
@Dragos Sicher können sie sein. Wenn ich eine andere Abfrage hatte, die nur über das Klassenjahr hinausging (alle Schüler, die in der Klasse von 2004 eine Schule besucht haben), kann der Klassenjahresindex hilfreich sein. Leider gibt es eine Menge Faktoren, die die Abfrage-Engine verwendet, um zu entscheiden, welcher Index wann verwendet wird. Wenn es , dass die Hälfte der Menschen in der Datenbank stellt sich heraus , hat im Jahr 2004 in der Schule ging, dann kann die Datenbank nur den Index ignorieren und sowieso die gesamte Tabelle scannen über. Wenn Sie sich darin auskennen möchten, beginnen Sie mit der Verwendung und dem Lesen von Ausführungsplänen
Chris Pitman,
Was ich damit meinte war: Wenn ich getrennte Verzeichnisse für Schule und Schuljahr habe, wären sie nützlich, wenn ich nach allen Personen suche, die zwischen 1980 und 1984 aus Klassen zu Duke gegangen sind?
Dragos
@ Dragos Es hängt von der spezifischen Datenbank-Engine ab. Beispielsweise verwendet Postgres einen sogenannten Bitmap-Index-Scan, um die Ergebnisse mehrerer Indizes zu schneiden. Es liegt an der Abfrage-Engine, zu entscheiden, welcher Index verwendet werden soll. Dies ist immer db-spezifisch.
Chris Pitman
2

Das Erstellen eines Index für jede Spalte in einer Tabelle ist in der Regel eine Verschwendung von Speicherplatz. Wie bereits erwähnt, kann dies Einfüge- / Aktualisierungsvorgänge verlangsamen. Ein Index wird verwendet, um Abfragen zu beschleunigen. Ich würde nur empfehlen, einer Spalte einen Index hinzuzufügen, wenn Sie beim Abfragen von Werten in dieser Spalte eine schlechte Leistung feststellen.

Für einige Datenbanken ist möglicherweise ein Index für den Primärschlüssel einer Tabelle erforderlich, sodass Sie möglicherweise keine Auswahl für diese haben. Wenn Sie über sehr große Textspalten verfügen, gibt es bestimmte Technologien, die für die Volltextsuche und den Index entwickelt wurden. Sie sind jedoch nicht immer die gleichen Arten von Indizes, die Sie für eine kleine numerische Spalte verwenden würden.

FrustratedWithFormsDesigner
quelle