2009-05-18 6 views
1

Angenommen, ich habe eine Tabelle in meinem DB-Schema namens TEST mit Feldern (ID, Name, Adresse, Telefon, Kommentare). Jetzt weiß ich, dass ich eine große Menge verschiedener Abfragen für diese Tabelle ausführen werde. Daher ist meine Frage, wann und warum ich Indizes wie ID_NAME_INDX (Index für ID und Name) erstellen soll und wann es effizienter ist, sie zu erstellen Index für ID und Index für Namensfeld separat (wenn ich meine, für welche Art von Abfrage)?RDBS wann komplexe Indizes für Abfragen und wann einfach zu verwenden?

+0

Sie meinen, dass die ID wiederholt werden kann (nicht eindeutig), also müssen Sie Redundanz für ID- und Namensfelder vermeiden? – Ahmy

+0

Nein ich meine, dass ich Index für Name und Index für ID-Feld erstellen kann oder stattdessen kann ich einen Index für beide Felder zusammen erstellen. Also frage ich, welcher Ansatz effizienter ist und für welche Art von Abfragen. –

Antwort

1

Das allgemeine Ziel wäre, alle Spalten zu "decken", so dass die Abfrage nur den Index verwenden muss.

-- An index on Name including ID would be ideal 
SELECT 
    [id] 
FROM 
    TEST 
WHERE 
    [name] = 'bob' 

Sagen wir, Sie brauchen Namen und Indizes, haben aber separate Indizes. Sie werden mit einer Lesezeichen-Suche aus dem Index der PK die anderen Spalten bekommen am Ende (es unter der Annahme durchsucht nicht nur die PK)

bearbeiten, die nach dem 1. Kommentar:

select * from test where id='id1' and name='Name1' 

Hierzu Abfrage, die SELECT *, aber gegen einen beliebigen Index mindert so die PK würde verwendet werden. Wenn Sie hatte:

select address from test where id='id1' and name='Name1' 

dann ein Index für ID, Name mit Adresse würde "bedecken" es.

Die Verwendung von "OR" führt zu Schwierigkeiten für jede Strategie. Allerdings

select address from test where id='id1' and name='Name1' 

würde immer noch die „ID, Name mit Adresse“ inex höchstwahrscheinlich verwenden, aber es scannen eher, dass

Lesen Sie diese suchen: Execution Plan Basics

+0

Nehmen wir also an, ich habe eine Abfrage: "Wählen Sie * aus dem Test mit ID = 'ID1' und Name = 'Name1'", soll ich einen komplexen Index verwenden oder für jedes Feld einzeln definieren? Und was, wenn statt "und" Klausel ich "oder" verwende? –

+0

Von Ihrem "alle Spalten abdecken" verstehe ich, dass Sie mir vorschlagen, einen Index für jedes Tabellenfeld zu erstellen. Habe ich Recht? Aber dann wird die Größe der DB zunehmen und ich bin mir nicht sicher, ob es sich lohnt, da ich redundante Indizes eliminieren kann, indem ich auf Abfrage suche. –

+0

Cover ist ein Index mit mehreren Spalten. Nicht eine pro Spalte, die ziemlich nutzlos ist. – gbn

0

Die meisten Datenbank-Software umfassen irgendeine Art von Werkzeug um Ihre Abfragen zu debuggen. Diese können Ihnen normalerweise sagen, welche Indizes der Server betrachtet und welche er verwendet hat. Diese Funktionalität wird normalerweise als EXPLAIN oder ähnliches bezeichnet.

Normalerweise sollten Sie Indizes für Spalten erstellen, die in der WHERE-Klausel oder den Joins verwendet werden.

+0

Ok, ich verstehe, aber meine Frage ist die nächste, theoretisch habe ich zwei Feld in meiner Where-Klausel (oder sogar mehr), soll ich komplexe Index verwenden Für beide Felder oder erstellen Sie für jedes Feld einen eigenen Index? –

1

Ich bin nicht sicher, ob Ihr Beispiel die eigentliche Frage erklärt, die Sie stellen. Sie sagen, dass Sie einen Index für ID und Index für Name haben sollten, im Gegensatz zu einem Index für ID und Name. Die Sache ist, ich denke, dass die ID Ihr Primärschlüssel ist und Sie wahrscheinlich keine Suche nach ID UND Name durchführen werden.

Jedoch in den Begriffen einer Tabelle mit zwei IDs, von denen Sie eine oder beide gemeinsam suchen möchten und dann drei Indizes haben, ist einer der IDs und einer kombiniert der schnellste. Wenn Sie zwei Indizes haben, müssen Sie nach dem Datensatz suchen, nach dem Sie suchen. Wenn Sie jedoch einen Index für beide IDs haben, muss nur dieser Index durchsucht werden.

Wie bei allen Indizes erhöht sich die Größe Ihrer Datenbank, wenn Sie sie hinzufügen, und Sie erhalten eine geringere Einfüge-/Aktualisierungsleistung. Sie müssen immer die Gewinne/Verluste abwägen.

Fügen Sie Indizes zu den absolut offensichtlichen Kandidaten hinzu, fügen Sie Indizes zu den "vielleicht" Einsen hinzu, je nach Bedarf. Überwachen Sie weiterhin die Leistung Ihrer Datenbank und führen Sie Abfrageanalysatoren durch, um festzustellen, wo im Laufe der Zeit Leistungsverbesserungen erzielt werden können.

+0

Vielen Dank für Ihre sehr klare Erklärung. Ich glaube, ich habe den entscheidenden Punkt. –

Verwandte Themen