2009-07-30 14 views
8

Was macht der INDEX-Ausdruck? Ein Beispiel am Ende:INDEX in Postgres?

CREATE TABLE tags (
    tag_id      varchar(255) NOT NULL, 
    "{Users}{userID}question_id" int4 NOT NULL, 
    tag       varchar(20), 
    CONSTRAINT tag 
    PRIMARY KEY (tag_id)); 
CREATE INDEX tags_tag 
    ON tags (tag); 
+5

Was ist los mit dir Leute, die Fragen wie diese herunterschwingen? Dies ist eine vollkommen gültige Frage, und tatsächlich gibt es viele Leute da draußen, die * denken *, dass sie alles über Datenbanken wissen und nicht erklären können, wie ein Index funktioniert. –

Antwort

10

ein index ist eine Datenbankstruktur, die Geschwindigkeit Zugriff auf einzelne Zeilen der Datenbank helfen kann, wenn sie auf dem Bereich (e) in dem Index-basierten Suche.

In Ihrem Beispiel erzeugt die CREATE INDEX Anweisung einen Index tags_tag auf der Tabelle mit dem Namen tags die Spalte tag verwenden. Wenn Sie auf der Grundlage des Felds tag nach Zeilen aus der Tabelle suchen möchten, verwendet die Datenbank möglicherweise den Index, um die Zeile effizienter zu suchen. Ohne einen Index muss die Datenbank möglicherweise auf einen vollständigen Scan der Tabelle zurückgreifen, der viel länger dauern kann (abhängig von vielen Faktoren, wie Größe der Tabelle, Verteilung der Werte, genaue Abfragekriterien). Verschiedene Datenbanken unterstützen auch verschiedene Arten von Indizes, mit denen auf unterschiedliche Weise nach Daten gesucht werden kann.

Es gibt auch einen Nachteil von Indizes: Für jeden Index gehen Schreibgeschwindigkeiten für diese Tabelle nach unten. Wenn Sie eine Zeile einfügen, bedeutet ein Index, dass zusätzlich zur Datenbank, die in die Zeile geschrieben wird, auch der Index aktualisiert werden muss.

Die Entscheidung, auf welche Spalten ein Index gesetzt werden soll, kann knifflig sein, und wie immer sind Benchmarks oder reale Abfragen mit realen Daten die genaueste Methode zur Leistungsmessung. Im Allgemeinen werden Indizes für Spalten gewünscht, nach denen Sie suchen. Also, wenn Sie wahrscheinlich eine Reihe von tag nachschlagen wollen, dann ist es definitiv sinnvoll, einen Index dort zu setzen. Aber wenn Sie ein Adressbuch haben, müssen Sie (wahrscheinlich) nicht nach der Straße, PLZ oder Telefonnummer suchen, so dass es sich nicht lohnt, die Schreibleistung zu erreichen.

Ihre Primärschlüsselspalte (n) haben fast immer einen Index, der automatisch von der Datenbank generiert wird. Und wenn Sie die Werte einer bestimmten Spalte eindeutig erhalten möchten, können Sie eine UNIQUE INDEX erstellen, um dies zu erzwingen.

This SO fragt nach Faustregeln für Datenbankindizes, die nützlich sein können.

+0

Gibt es eine Art von Thumbrules, wenn Sie einen Index haben sollten? Ich habe im Beispiel eher intuitiv den Index gewählt, weil die SO-Style-Tags wahrscheinlich die Zugriffsgeschwindigkeit den Flaschenhals haben. –

+0

Ist es ein Index? Ich speichere md5deep (question_id, user_id, time) -hashes als Primärschlüssel für eine Tabelle, statt jeden Wert einzeln abzufragen. –

+0

Es beschleunigt die Zugriffszeit für den Kompromiss: erhöhte Schreibzeit. –