Zusammengesetzte Indizes und Spaltenreihenfolge
Wählen Sie die Spaltenreihenfolge für zusammengesetzte Indizes, verstehen Sie die Left-Prefix-Regel und entwerfen Sie Indizes, die mehrere Abfragen abdecken.
Zusammengesetzte Indizes und Spaltenreihenfolge ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist ein zusammengesetzter Index?
Ein Index über mehr als eine Spalte. PostgreSQL-B-trees können bis zu 32 Spalten indizieren; in der Praxis sind 2–4 üblich.
CREATE INDEX orders_user_created_idx ON orders(user_id, created_at DESC);Warum zusammengesetzte Indizes verwenden?
Zwei Szenarien:
- Die Abfrage filtert gleichzeitig nach mehreren Spalten
- Die Abfrage filtert nach einer Spalte und sortiert nach einer anderen
Präfixregel von links
Ein Index auf (a, b, c) kann Folgendes unterstützen:
WHERE a = ?WHERE a = ? AND b = ?WHERE a = ? AND b = ? AND c = ?
Er unterstützt NICHT allein WHERE b = ? und auch nicht WHERE c = ?.
Die Reihenfolge ist entscheidend
Setzen Sie die selektivste und am häufigsten gefilterte Spalte an die erste Stelle. Gleichheitsspalten kommen vor Bereichsspalten:
CREATE INDEX orders_user_total_idx ON orders(user_id, total);
-- Best for: WHERE user_id = 42 AND total > 100
-- Also OK: WHERE user_id = 42
-- Useless: WHERE total > 100 (without user_id)Gleichheit vs. Bereich
Gleichheitsprädikate verwenden den Index effizient; Bereiche verwenden ihn ebenfalls, schränken aber seinen weiteren Nutzen ein. Gleichheitsspalten sollten zuerst kommen:
-- Index: (status, created_at)
WHERE status = 'paid' AND created_at >= ... -- both columns used
WHERE created_at >= ... AND status = 'paid' -- index used for status, range scan on created_atIndexreihenfolge = Sortierreihenfolge
Ein Index auf (user_id, created_at DESC) unterstützt „Bestellungen eines Benutzers, neueste zuerst“, ohne einen Sortierschritt:
EXPLAIN ANALYZE
SELECT * FROM orders
WHERE user_id = 42
ORDER BY created_at DESC LIMIT 10;
-- Index Scan, no Sort node neededNicht-Schlüsselspalten einschließen (INCLUDE)
PG 11+ unterstützt INCLUDE für „Covering“-Indizes – zusätzliche Spalten werden in den Blattknoten gespeichert, aber nicht für die Sortierreihenfolge verwendet:
CREATE INDEX orders_user_idx ON orders(user_id)
INCLUDE (total, status);
-- Enables Index-Only Scan for queries that need just these columns.Wann Sie keine zusammengesetzten Indizes erstellen sollten
Wenn die Spalten unabhängig voneinander abgefragt werden, können zwei einspaltige Indizes mehr Abfragen unterstützen. Zusammengesetzte Indizes tauschen Flexibilität gegen „eine Abfrage hat alles“ ein.
Kombination von Bitmap-Indizes
PostgreSQL kann mehrere Einzelspaltenindizes über einen Bitmap Index Scan kombinieren:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
-- BitmapAnd of two index scans — works without a composite, but slower than the right composite.Index-Bloat beobachten
Zusammengesetzte Indizes sind breiter. Breitere Indizes = größere Dateien = ein kleinerer Anteil des Index passt in den Cache. Gehen Sie bewusst damit um.
Spaltenreihenfolge wählen – ein durchgängiges Beispiel
Abfrage: „Bestellungen eines Benutzers in einem Datumsbereich, nach Datum sortiert“.
-- Index design:
CREATE INDEX orders_user_created_idx
ON orders(user_id, created_at DESC);
-- Query (efficiently uses the index):
SELECT * FROM orders
WHERE user_id = 42
AND created_at >= NOW() - INTERVAL '30 days'
ORDER BY created_at DESC LIMIT 10;Zusammenfassung
Zusammengesetzte Indizes unterstützen Filter über mehrere Spalten und vermeiden Sortierschritte.
- Regel des linksseitig längsten Präfixes
- Gleichheitsspalten zuerst
- INCLUDE für ausschließlich abdeckende Spalten
- Zwei Einzelindizes oder ein zusammengesetzter Index – hängt von der Abfragemischung ab
Kurztest
Sie haben einen Index auf (user_id, status, created_at). Welche Abfrage kann ihn NICHT effizient nutzen?
Häufig gestellte Fragen
Ist die Lektion „Zusammengesetzte Indizes und Spaltenreihenfolge“ kostenlos?
Ja — der vollständige Text von „Zusammengesetzte Indizes und Spaltenreihenfolge“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Zusammengesetzte Indizes und Spaltenreihenfolge“?
Wählen Sie die Spaltenreihenfolge für zusammengesetzte Indizes, verstehen Sie die Left-Prefix-Regel und entwerfen Sie Indizes, die mehrere Abfragen abdecken. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Zusammengesetzte Indizes und Spaltenreihenfolge“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- B-tree- vs. Hash- vs. GiST- vs. GIN-Indizes
- Zusammengesetzte Indizes und Spaltenreihenfolge
- Partielle Indizes und Ausdrucksindizes
- Indexwartung und Bloat