Wo finde ich Anleitungen zu Indexstrategien?

22

Die meisten von uns werden wahrscheinlich zustimmen, dass die Verwendung von Datenbankindizes gut ist. Zu viele Indizes und die Leistung können tatsächlich beeinträchtigt werden.

Welche Felder sollten generell indiziert werden?
Welche Felder sollen nicht indiziert werden?
Welche Regeln gelten für die Verwendung von Indizes, wenn ein Gleichgewicht zwischen zu vielen und zu wenig Indizes hergestellt wird, um Leistungsverbesserungen und keine Verschlechterungen zu erzielen?

SpecialAgent_W436
quelle
7
Hinweise zur Indexierung finden Sie unter-the-index-luke.com
Mike Sherrill 'Cat Recall'

Antworten:

24

Kurz

Die Regel "zu viele Indizes" ist meiner Meinung nach etwas irreführend.

Lange

Angesichts der Tatsache, dass die durchschnittliche Datenbank zu 98% (oder mehr) Lesezugriffe umfasst, müssen diese optimiert werden. Ein INSERT ist ein Lesevorgang, wenn beispielsweise ein eindeutiger Index vorhanden ist. Oder das WHERE bei einem Update. Ich habe mal gelesen, dass selbst eine schreibintensive Datenbank noch 85% liest.

Was Sie haben, ist eine Indizierung mit schlechter Qualität. Beispiele:

  • weite Clustered-Indizes (insbesondere SQL Server)
  • nicht monoton gruppiert indiziert
  • überlappende Indizes (zB cold, coleundcold, cole, colf)
  • Viele einzelne Spaltenindizes (auch überlappend mit nützlicheren Indizes), die für Ihre Abfragen unbrauchbar sind
  • keine INCLUDEs, nicht abdeckend (zB alle Einzelspaltenindizes)
  • ...

Beachten Sie, dass Indizes selbst in OLTP-Systemen in der Regel um ein Vielfaches größer sind als Ihre eigentlichen Daten.

Generell würde ich mit dem anfangen

  • Clustered Index (normalerweise PK)
  • eindeutige Indizes (keine Einschränkungen, diese können nicht abgedeckt werden)
  • Fremdschlüsselspalten

Dann würde ich schauen:

  • Häufig gestellte Fragen und sehen, was ich brauche. Eine Abfrage, die alle Sekunden ausgeführt wird, muss optimiert werden. Der Bericht am Sonntag 4 Uhr kann warten.
  • mit SQL Server die gewichteten fehlenden Index-DMVs

Um das zu sagen, ich habe diese Regeln für einige Systeme gebrochen, nachdem ich gesehen habe, wie die Dinge verschoben wurden (10 Milliarden Zeilen später), um ein System zu optimieren. Aber ich würde niemals in Betracht ziehen, nicht zu indizieren, wenn ich nicht demonstrieren könnte, warum ich das tue.

gbn
quelle
2
Woher hast du diese Zahlen? 98% scheinen furchtbar hoch zu sein, vor allem im Zeitalter von "Big Data" (aka alles speichern und hoffen, dass es eines Tages nützlich ist)
06.09.13
7

Sie sollten Ihre Datenbanknutzung und -auslastung profilieren und Engpässe aufgrund fehlender Indizes oder aufgrund zu vieler Indizes ermitteln. Dann müssen Sie den richtigen Index auswählen - und das setzt gute Kenntnisse der spezifischen Indizierungstechniken für Datenbanken voraus.

ldsandon
quelle
7

Ganz einfach eine der besten Artikelreihen, die über die zu wählenden Indizes und warum von Gail Shaw geschrieben wurden. Die Artikel finden Sie hier

Die Frage, die Sie stellen, kann auf 50 verschiedene Arten beantwortet werden. Es kommt wirklich darauf an, welche Daten Sie haben und wie sie abgefragt werden. Eine allgemeine Regel ist, dass Sie immer einen Clustered-Index für jede Tabelle haben sollten, um Heaps zu vermeiden. Clustered-Indizes sollten normalerweise so klein wie möglich sein. Wenn die Tabelle über einen Clustered-Index verfügt, speichern alle Indexdatensätze auf den Blattseiten des Nicht-Clustered-Index den Datensatzwert des jeweiligen Clustered-Index für die Lesezeichensuche. Wenn eine Tabelle ein Heap ist, erstellt SQL einen eindeutigen Bezeichner für die Lesezeichensuche. Ich kann mich nicht erinnern, ob es 8 oder 16 Bytes sind. Dies könnte ein viel größerer Datentyp sein als ein INT. Stellen Sie sich 8 nicht gruppierte Indizes in einer Heap-Tabelle vor.

TRAD
quelle
Nur eine Anmerkung für die Leser: MS SQL "Bookmark Lookup" entspricht Oracle "ACCESS BY ROWID". Siehe stackoverflow.com/a/820731/122727
kubanczyk
5

Ich möchte hier hinzufügen, dass unterschiedliche Datenbanken unterschiedliche Strategien erfordern. Vergleichen wir zum Beispiel MySQL mit InnoDB und PostgreSQL.

InnoDB

InnoDB-Tabellen sind im Grunde genommen ein B-Tree-Index des Primärschlüssels, der um die Zeileninformationen im Indexeintrag erweitert wird. Überprüfungen der physischen Reihenfolge werden nicht unterstützt und alle Überprüfungen erfolgen in logischer Reihenfolge. Das bedeutet zwei Dinge:

  1. Ein sequentieller Scan in Innodb generiert eine Menge zufälliger Festplatten-E / A und

  2. Der Primärschlüsselindex muss durchlaufen werden, unabhängig davon, ob ein Sekundärindex verwendet wird.

  3. Primärschlüssel-Lookups sind in diesem Modell schneller als in jedem anderen Ansatz.

In diesem Fall ist es sehr wichtig, genügend Felder in mehrseitigen Tabellen zu indizieren. Die typische Regel ist, alles zu indexieren, nach dem Sie filtern möchten.

PostgreSQL

PostgreSQL verwendet Heap-Dateien, eine Tabelle pro Datei (einige Tabellen können viele Dateien sein), wobei Tupel aus dem freien Speicherplatz dieses Heaps zugewiesen werden. Physische Order-Scans werden unterstützt. Damit ein Scan nach logischer Reihenfolge funktioniert, muss ein Index hinzugefügt werden.

Primärschlüssel in PostgreSQL sind im Grunde eine Teilmenge eindeutiger Indizes, bei denen keine Werte NULL sein dürfen. UNIQUE-Einschränkungen werden unter Verwendung impliziter Indizes durchgeführt, und verschiedene andere Indextypen werden mit unterschiedlichen Operationen unterstützt, die im Index möglich sind.

Das heisst:

  1. Primärschlüssel-Lookups unter der Annahme, dass eine relativ große Tabelle eine Indexdatei und eine Tabellendatei trifft . Dies ist erheblich langsamer als der Ansatz von MySQL, bei dem nur der Index durchlaufen werden muss und die Zeile im Index enthalten ist.

  2. Bei physischen Ordnungsprüfungen ist die Leistung wesentlich besser, da weniger zufällige Datenträger-E / A-Vorgänge ausgeführt werden müssen, wenn eine erhebliche Anzahl von Zeilen verarbeitet werden soll.

  3. Sekundärindex-Scans sind leistungsfähiger als MySQL, da nur ein Index durchlaufen werden muss, um zum physischen Teil der Tabelle zu gelangen.

In diesem Modell sind häufig Indizes erforderlich, aber der Planer hat mehr Freiheit, einen Index zu verwenden, und die Auswirkungen der Nichtverwendung sind häufig weniger schwerwiegend. Die Tabellen sind allgemeiner optimiert (anstatt sich auf pkey-Lookups zu spezialisieren), sodass weniger Indizes erforderlich sind.

TL; DR

Kennen Sie Ihre RDBMS.

Chris Travers
quelle
2

Selbst mit all den oben genannten Links, Sie müssen schauen , was Kimberly Tripp geschrieben hat in Bezug auf die Pflege, Fütterung, und die Verwendung von Indizes.

Folgen Sie zunächst diesem Link zu Kimberlys Sammlung indexbezogener Blog-Posts. Sie können bestimmte Themen mit den Widgets "Auf dieser Seite" und "Kategorien" auf der linken Seite Ihres Browserfensters untersuchen.

Hier gibt es viele Informationen, aber lassen Sie sich nicht entmutigen.

Die Info-Seite von Kimberly ist hier

Robert Miller
quelle