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?
Antwort
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
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? –
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. –
Cover ist ein Index mit mehreren Spalten. Nicht eine pro Spalte, die ziemlich nutzlos ist. – gbn
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.
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? –
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.
Vielen Dank für Ihre sehr klare Erklärung. Ich glaube, ich habe den entscheidenden Punkt. –
- 1. Wann socket.io zu verwenden und wann Ajax zu verwenden
- 2. Wann Datenbankansichten verwenden und wann nicht?
- 3. Wann node.js verwenden und wann Ajax verwenden?
- 4. Wann System() verwenden und wann execv *() verwenden?
- 5. Wann zu verwenden und wann nicht Python 3.5 `erwarten 'verwenden?
- 6. JPA - wann Beziehungen zu verwenden?
- 7. Wann GWT zu verwenden ist und wann nicht
- 8. Wann zu verwenden behalten und wann zu kopieren
- 9. Luftstrom: Wann SellerieExecutor und wann MesosExecutor verwenden
- 10. Wann und wann nicht CoreAnimation verwenden
- 11. Wann NSURLProtocol zu verwenden?
- 12. Java: Wann Generika-Methode zu verwenden und wann explizite Methode
- 13. Wann "if" und "wann" in Clojure verwenden?
- 14. Wann ein Modul zu verwenden, und wann eine Klasse
- 15. Railties - Wann zu verwenden
- 16. Wann Indizes zu Tabellen hinzugefügt werden?
- 17. Wann CheckBox zu verwenden ist und wann Switch
- 18. Wann 'if ... else if' und wann zu verwenden ist
- 19. Wann zu verwenden und wann importieren in Aurelia?
- 20. Wann Texturansichten zu verwenden
- 21. Wann selbst zu verwenden?
- 22. Wann verwenden wir POJO und wann verwenden wir SLSB
- 23. GWT: Wann LazyDomElement zu verwenden?
- 24. PHP: Wann Traits zu verwenden und wann statische Methoden zu verwenden?
- 25. SQL-Indizes neu erstellen - wann?
- 26. Wann IEquatable verwenden und warum
- 27. Sphinx - Wann 'has' und 'indexes' für Felder zu verwenden ist
- 28. Wann DropWizard Bundles zu verwenden?
- 29. Wann undef_method und wann remove_method?
- 30. BitmapCache? Wann und wie zu verwenden?
Sie meinen, dass die ID wiederholt werden kann (nicht eindeutig), also müssen Sie Redundanz für ID- und Namensfelder vermeiden? – Ahmy
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. –