2009-04-18 10 views
15

Kürzlich beschleunigte ich eine komplizierte Abfrage um eine Größenordnung, indem ich SQLite einen guten Index zum Arbeiten gab. Solche Ergebnisse lassen mich fragen, ob ich viele andere Felder indizieren sollte, die häufig für JOINs oder ORDER BY-Klauseln verwendet werden. Aber ich möchte nicht übereifrig werden und es auf mich zurückfeuern lassen: Ich nehme an, dass es einige Gründe geben muss nicht Indizes zu erstellen, oder jedes Feld würde standardmäßig indiziert werden.Was sind die Nachteile vieler Indizes?

Ich benutze in diesem Fall SQLite, aber natürlich ist DBMS-agnostic Beratung auch willkommen.

Antwort

36

Indizes verlangsamen Einfügungen und Updates (was ein ernsthaftes Problem beim Sperren werden kann) und kosten Speicherplatz. Das wars so ziemlich.

+2

Das deckt es ab. Vergessen Sie nicht, dass Sie auch richtige Indizes für eine gute Einfüge-/Aktualisierungs-/Löschleistung benötigen. Wie alle Dinge ist es ein Gleichgewicht. –

+5

Inserts profitieren nicht von Indizes ... Updates und Deletes erfordern das Auffinden der relevanten Zeile (n), so dass sie von Indizes für diesen Schritt profitieren, aber wenn Sie zu viele Indizes haben, kann sogar dieser Vorteil negiert werden. Wie Sie sagen, es ist alles ein Gleichgewicht :) – MatBailie

6

Indizes verbrauchen Speicherplatz auf der Disc und benötigen Zeit zum Erstellen und Verwalten. Ungenutzte geben keinen Vorteil. Wenn es viele Kandidatenindizes für eine Abfrage gibt, kann die Abfrage verlangsamt werden, indem der Server den "falschen" für die Abfrage auswählt.

Verwenden Sie diese Faktoren, um zu entscheiden, ob Sie einen Index benötigen.

Es ist normalerweise möglich, Indizes zu erstellen, die NIE verwendet werden - zum Beispiel, und einen Index auf ein (nicht null) Feld mit nur zwei möglichen Werten zu haben, wird mit ziemlicher Sicherheit nutzlos sein.

Sie müssen die Abfragen Ihrer eigenen Anwendung erklären, um sicherzustellen, dass die häufig verwendeten Indizes nach Möglichkeit sinnvolle Indizes verwenden, und keine weiteren Indizes erstellen, als dafür erforderlich sind.

+0

Die Indizierung eines zweiwertigen Feldes kann (gelegentlich) nützlich sein, wenn die Verteilung extrem ungleichmäßig ist - und die Datenbank weiß es durch Statistiken. –

5

Die Kosten für einen Index im Speicherplatz sind im Allgemeinen trivial. Die Kosten zusätzlicher Schreibvorgänge, um den Index zu aktualisieren, wenn sich die Tabelle ändert, sind oft moderat. Die Kosten für zusätzliches Sperren können sehr hoch sein.

Es hängt vom Lese-/Schreibverhältnis in der Tabelle ab und davon, wie oft der Index tatsächlich verwendet wird, um eine Abfrage zu beschleunigen.

+1

Hmmm, abhängig von der Tabelle und den Feldern, die indiziert werden, sind die Speicherplatzkosten nicht immer trivial. Ich hatte viele Fälle, wo die Summe des Indexraums doppelt (oder mehr) als die Summe des Tabellenbereichs war ... – MatBailie

+0

Zustimmen mit Dems; Bei einer engen Tabelle kann ein Nonclustered-Index eine vergleichbare Größe wie die Tabelle haben. Angenommen, ein Index kostet die Hälfte des Speicherplatzes der Tabelle selbst; Eine Tabelle mit sechs Indizes ist viermal so groß wie eine nicht indizierte. Clustered-Indizes sind grundsätzlich frei. –

+1

Nein, die Kosten eines Index im Disc-Bereich sind nicht "generell trivial".Es ist möglich, viel Platz mit Indizes zu belegen. – MarkR

6

Um Ihre spezielle Anwendung zu testen, können Sie "EXPLAIN QUERY PLAN" vor jeder ausgeführten Abfrage platzieren und die Ergebnisse überprüfen. Es zeigt Ihnen, wo es Indizes gibt oder nicht.

Auf diese Weise können Sie bestimmen, wo Sie mehr Indizes verwenden könnten und wo sie keinen Unterschied machen würden.

Sqlite Explain

Ich benutze SqliteSpy an Hand der Testabfrage, die scheinen Probleme zu verursachen.

Verwandte Themen