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?
Antworten:
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:
cold, cole
undcold, cole, colf)
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
Dann würde ich schauen:
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.
quelle
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.
quelle
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.
quelle
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:
Ein sequentieller Scan in Innodb generiert eine Menge zufälliger Festplatten-E / A und
Der Primärschlüsselindex muss durchlaufen werden, unabhängig davon, ob ein Sekundärindex verwendet wird.
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:
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.
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.
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.
quelle
Im Oracle 11.2 Concepts Guide:
Aus dem 11.2 Performance Tuning Guide:
Aus dem 11.2 Administrator's Guide:
quelle
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
quelle
Im Folgenden sind einige weitere Ressourcen aufgeführt, die für die Arbeit mit SQL Server möglicherweise hilfreich sind:
quelle