Aikido

Warum redundante Datenbankindizes vermeiden: Optimierung der Speicher- und Schreibleistung

Leistung

Regel

Vermeiden Sie redundante Datenbank Indizes.
Überschneidungen Datenbank Indizes verschwenden
Speicherplatz und verlangsamen verlangsamen schreibt.

Unterstützte Sprachen: SQL

Einführung

Redundante Indizes treten auf, wenn mehrere Indizes dieselben Spalten abdecken oder wenn ein Index ein Präfix eines anderen ist. Jeder Index verbraucht Speicherplatz und muss bei INSERT-, UPDATE- und DELETE-Operationen aktualisiert werden. Eine Tabelle mit fünf sich überschneidenden Indizes für ähnliche Spalten büßt fünfmal an Schreibleistung ein, während ein einziger Index für die Leseoptimierung ausreichen würde.

Warum das wichtig ist

Auswirkungen auf die Leistung: Jeder Index verlangsamt die Schreibvorgänge, da die Datenbank bei Datenänderungen alle Indizes aktualisieren muss. Redundante Indizes vervielfachen diese Kosten, ohne Abfragevorteile zu bieten. Eine Tabelle mit drei redundanten Indizes auf Benutzer_id verdreifacht den Schreibaufwand, während immer nur ein Index verwendet wird.

Speicherkosten: Indizes verbrauchen Speicherplatz proportional zur Größe der indizierten Spalten und der Anzahl der Zeilen. Redundante Indizes vergeuden Speicherplatz, der für eigentliche Daten oder nützliche Indizes verwendet werden könnte. Große Tabellen mit unnötigen Indizes können Gigabytes an Speicherplatz verschwenden.

Komplexität der Wartung: Mehr Indizes bedeuten mehr zu überwachende, zu analysierende und zu wartende Objekte. Datenbankadministratoren verbringen Zeit mit der Optimierung von Indizes, die keinen Nutzen bringen. Abfrageplaner haben mehr Optionen zu bewerten und wählen möglicherweise suboptimale Ausführungspläne.

Code-Beispiele

❌ Nicht konform:

-- Redundante Indizes für die Tabelle users
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_benutzer_email_status ON users(email, status);
CREATE INDEX idx_benutzer_erstellt ON users(created_at);
CREATE INDEX idx_benutzer_erstellt_status ON users(created_at, status);

-- Die einspaltigen Indizes sind überflüssig, weil
-- die zusammengesetzten Indizes die gleichen Abfragen bedienen können

Warum das falsch ist: Der Index für E-Mail ist überflüssig, weil idx_benutzer_email_status beginnt mit E-Mail und kann Abfragen bearbeiten, die nur nach E-Mails filtern. Ähnlich, idx_users_created ist redundant mit idx_benutzer_erstellt_status. Jede Einfügung oder Aktualisierung dieser Tabelle aktualisiert vier Indizes, obwohl zwei ausreichen würden.

✅ Konform:

-- Optimierte Indizes für die Tabelle users
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_benutzer_erstellt_status ON users(created_at, status);

-- Zusammengesetzte Indizes können Abfragen auf ihre Präfixspalten durchführen
-- Abfragen nur auf email verwenden idx_users_email_status
-- Abfragen nur für created_at verwenden idx_users_created_status

Warum das wichtig ist: Zwei zusammengesetzte Indizes bedienen alle Abfragemuster und eliminieren Redundanzen. Abfragen filtern nach E-Mail allein verwenden den ersten Index, und Abfragen, die nach erstellt_am allein den zweiten verwenden. Die Schreibleistung verbessert sich, da nur zwei statt vier Indizes aktualisiert werden müssen.

Schlussfolgerung

Überprüfen Sie Ihre Datenbankindizes regelmäßig, um überflüssige Indizes zu identifizieren. Entfernen Sie Indizes, die anderen Indizes vorangestellt sind oder die die Abdeckung duplizieren. Zusammengesetzte Indizes können Abfragen auf ihren führenden Spalten bedienen, wodurch separate einspaltige Indizes in den meisten Fällen überflüssig sind.

FAQs

Haben Sie Fragen?

Wie kann ich redundante Indizes in meiner Datenbank identifizieren?

Fragen Sie die Systemtabellen Ihrer Datenbank ab, um alle Indizes aufzulisten. Für PostgreSQL, verwenden Sie pg_indexes view. Für MySQL, verwenden Sie SHOW INDEX FROM table_name. Suchen Sie nach Indizes, bei denen einer ein Präfix eines anderen ist (email vs. email+status) oder bei denen mehrere Indizes dieselben Spalten in unterschiedlicher Reihenfolge abdecken.

Wann ist ein einspaltiger Index nicht redundant zu einem zusammengesetzten Index?

Wenn Selektivität der Abfrage wichtig ist. Wenn Sie häufig nur die zweite Spalte eines zusammengesetzten Indexes abfragen, kann diese Abfrage den Index nicht effizient nutzen. Ein Index auf (status, email) hilft nicht bei Abfragen, die nur nach E-Mail filtern. Ein Index auf (email, status) kann jedoch Abfragen auf nur email bedienen.

Wie wirken sich redundante Indizes auf die Abfrageleistung aus?

Geringfügig für Lesevorgänge, erheblich für Schreibvorgänge. Der Abfrageplaner kann zwischen redundanten Indizes wählen, aber die Ausführungszeit ist ähnlich. Allerdings müssen bei jedem Schreibvorgang (INSERT, UPDATE, DELETE) alle Indizes aktualisiert werden, wodurch sich die E/A-Vorgänge vervielfachen. Bei schreibintensiven Tabellen kann das Entfernen redundanter Indizes den Durchsatz um 20-50 % verbessern.

Sollte ich alle einspaltigen Indizes entfernen, wenn ich zusammengesetzte Indizes habe?

Nicht immer. Wenn der einspaltige Index sehr selektiv ist und häufig allein abgefragt wird, sollten Sie ihn behalten. Verwenden Sie Datenbankabfrage-Statistiken, um zu sehen, welche Indizes tatsächlich verwendet werden. Löschen Sie Indizes mit null oder sehr geringer Nutzung. Moderne Datenbanken verfolgen die Indexnutzung in Systemansichten.

Starten Sie kostenlos

Sichern Sie Ihren Code, Cloud und die Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell  automatisch.

Keine Kreditkarte erforderlich | Scanergebnisse in 32 Sekunden.