Wann man zusammengesetzte Indizes in SQL verwendet
Lukas Schneider
DevOps Engineer · Leapcell

Wann sollten Sie die Verwendung von zusammengesetzten Indizes in Betracht ziehen?
Ein zusammengesetzter Index (auch Mehrspaltenindex genannt) ist ein Index, der auf mehreren Spalten erstellt wurde. Er eignet sich typischerweise für die folgenden Szenarien:
Abfragen mit mehreren Bedingungen (WHERE-Filter auf mehreren Spalten)
Wenn eine Abfrage mehrere Bedingungen enthält, ist ein Einzelspaltenindex möglicherweise nicht effektiv, während ein zusammengesetzter Index die Abfrage beschleunigen kann.
SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
Wenn ein zusammengesetzter Index für (user_id, status) erstellt wurde, kann die Abfrage den Index effektiv nutzen.
Indizierte Spalten erscheinen häufig zusammen in Abfragen
Wenn col1
und col2
häufig zusammen in WHERE-Filtern, Sortierungen oder Gruppierungen verwendet werden, sollten Sie die Erstellung eines zusammengesetzten Index für (col1, col2) in Betracht ziehen.
Die Abfrage muss durch den Index abgedeckt werden
Wenn die Spalten in der SELECT-Abfrage alle im zusammengesetzten Index enthalten sind, können die Daten direkt aus dem Index abgerufen werden, wodurch Tabellenzugriffe vermieden und die Leistung verbessert wird (abdeckender Index).
SELECT user_id, status FROM orders WHERE user_id = 1001;
Wenn ein (user_id, status)-Index vorhanden ist, können die Daten direkt aus dem Index abgerufen werden, ohne auf die Tabellendaten zuzugreifen.
Reihenfolge der Indexspalten stimmt mit den Abfragemustern überein
MySQL verwendet die Regel der "Leftmost Prefix". Die Reihenfolge der Spalten in einem zusammengesetzten Index beeinflusst, ob die Abfrage den Index verwenden kann.
Wenn es nur eine Abfragebedingung gibt, ist dann ein zusammengesetzter Index überhaupt notwendig?
Nicht unbedingt. Es hängt hauptsächlich von den folgenden Situationen ab:
Ob die Spalte eine hohe Selektivität aufweist
Wenn die abgefragte Spalte allein eine hohe Selektivität aufweist (hohe Kardinalität, wie z. B. user_id
), dann kann ein Einzelspaltenindex ausreichend sein.
Wenn die Spalte eine geringe Selektivität aufweist (z. B. status
hat nur wenige mögliche Werte), kann ein zusammengesetzter Index besser sein.
Ob in zukünftigen Abfragen zusätzliche Bedingungen hinzugefügt werden
Auch wenn die aktuelle Abfrage nur WHERE col1 = ?
ist, ist die Erstellung eines zusammengesetzten Index für (col1, col2) sinnvoller, wenn die Möglichkeit besteht, dass col2
in Zukunft hinzugefügt wird.
Ob ORDER BY oder GROUP BY üblich ist
Wenn ORDER BY col1, col2
oder GROUP BY col1, col2
ebenfalls üblich sind, hilft ein zusammengesetzter Index bei der Optimierung von Sortierung und Gruppierung.
Beispielanalyse
Abfrage nur von user_id
SELECT * FROM orders WHERE user_id = 1001;
Wenn user_id
eine hohe Selektivität aufweist, ist ein Einzelspaltenindex für (user_id
) ausreichend.
Wenn status
jedoch auch ein häufig verwendeter Filter ist und Abfragen oft WHERE user_id AND status
enthalten, sollten Sie einen zusammengesetzten Index für (user_id
, status
) in Betracht ziehen.
Abfrage von sowohl user_id
als auch status
SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
Ein zusammengesetzter Index für (user_id
, status
) ist effektiver als ein einzelner Index für (user_id
), da er die Notwendigkeit eines zusätzlichen Filterschritts für status
vermeidet.
Abfrage nur von status
SELECT * FROM orders WHERE status = 'shipped';
Wenn ein zusammengesetzter Index für (user_id
, status
) existiert, status
aber nicht das "Leftmost Prefix" ist, kann der Index nicht vollständig genutzt werden.
In diesem Fall kann ein zusätzlicher Einzelspaltenindex für (status
) erforderlich sein.
Fazit
- Für Einzelspaltenabfragen ist ein Einzelspaltenindex in der Regel ausreichend. Wenn jedoch in Zukunft zusätzliche Bedingungen hinzugefügt werden können, ist ein zusammengesetzter Index sinnvoller.
- Wenn die Abfragebedingungen mehrere Spalten umfassen, ist ein zusammengesetzter Index effizienter als mehrere Einzelspaltenindizes.
- Das Indexdesign sollte Faktoren wie das "Leftmost Prefix"-Prinzip, Abfragemuster, Selektivität und ob der Index die Abfrage abdecken kann, berücksichtigen.
Wir sind Leapcell, Ihre erste Wahl für das Hosting von Backend-Projekten.
Leapcell ist die Next-Gen Serverless Plattform für Webhosting, asynchrone Aufgaben und Redis:
Multi-Language Support
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- zahlen Sie nur für die Nutzung - keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Mio. Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive UI für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für verwertbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Auto-Skalierung zur einfachen Bewältigung hoher Parallelität.
- Null operativer Aufwand - konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ