Aikido

Warum redundante Datenbankindizes vermeiden: Optimierung von Speicherplatz und Schreibleistung

Performance

Regel

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

Unterstützte Sprachen: SQL

Einleitung

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 überlappenden Indizes auf ähnlichen Spalten zahlt den Preis für die Schreibperformance fünfmal, während nur ein Index für die Leseoptimierung ausreichen würde.

Warum es wichtig ist

Leistungsbeeinträchtigung: Jeder Index verlangsamt Schreiboperationen, da die Datenbank alle Indizes aktualisieren muss, wenn sich Daten ändern. Redundante Indizes vervielfachen diese Kosten, ohne Vorteile für Abfragen zu bieten. Eine Tabelle mit drei redundanten Indizes auf user_id verdreifacht den Schreib-Overhead, während nur ein Index verwendet wird.

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

Wartungskomplexität: Mehr Indizes bedeuten mehr Objekte, die überwacht, analysiert und gewartet werden müssen. Datenbankadministratoren verbringen Zeit mit der Optimierung von Indizes, die keinen Wert bieten. Query-Planer haben mehr Optionen zur Bewertung 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_users_email_status ON users(email, status);
CREATE INDEX idx_users_created ON users(created_at);
CREATE INDEX idx_users_created_status ON users(created_at, status);

-- Die Single-Column-Indizes sind redundant, da
-- die zusammengesetzten Indizes dieselben Abfragen bedienen können

Warum es falsch ist: Der Index auf E-Mail ist redundant, weil idx_users_email_status beginnt mit E-Mail und kann Abfragen verarbeiten, die nur nach E-Mail filtern. Ähnlich verhält es sich, idx_users_created ist redundant mit idx_users_created_status. Jede Einfügung oder Aktualisierung in 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_users_created_status ON users(created_at, status);

-- Zusammengesetzte Indizes können Abfragen auf ihren Präfixspalten bedienen
-- Abfragen nur nach E-Mail verwenden idx_users_email_status
-- Abfragen nur nach created_at verwenden idx_users_created_status

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

Fazit

Überprüfen Sie Ihre Datenbankindizes regelmäßig, um redundante Indizes zu identifizieren. Entfernen Sie Indizes, die Präfixe anderer Indizes sind oder die Abdeckung duplizieren. Verbundindizes können Abfragen auf ihren führenden Spalten bedienen, wodurch in den meisten Fällen separate Einzelspaltenindizes überflüssig werden.

FAQs

Haben Sie Fragen?

Wie identifiziere ich redundante Indizes in meiner Datenbank?

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

Wann ist ein Einzelspaltenindex nicht redundant zu einem zusammengesetzten Index?

Wenn die Abfrageselektivität 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 Abfragen nicht, die nur nach E-Mail filtern. Ein Index auf (email, status) kann jedoch Abfragen nur nach E-Mail bedienen.

Wie beeinflussen redundante Indizes die Abfrageleistung?

Minimal bei Lesezugriffen, signifikant bei Schreibzugriffen. Der Query-Planer mag zwischen redundanten Indizes wählen, aber die Ausführungszeit ist ähnlich. Jeder Schreibvorgang (INSERT, UPDATE, DELETE) muss jedoch alle Indizes aktualisieren, was die I/O-Operationen vervielfacht. 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 hochselektiv ist und häufig allein abgefragt wird, behalten Sie ihn bei. Nutzen Sie Datenbankabfragestatistiken, um zu sehen, welche Indizes tatsächlich verwendet werden. Löschen Sie Indizes mit keiner oder sehr geringer Nutzung. Moderne Datenbanken verfolgen die Indexnutzung in System-Views.

Werden Sie jetzt sicher.

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

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.