Regel
Vermeiden Sie redundante Datenbank Indizes.
Überschneidungen Datenbank Indizes verschwenden
Speicherplatz und verlangsamen verlangsamen schreibt.
Unterstützte Sprachen: SQLEinfü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.
.avif)
