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