Warum ist die Abfrage langsam? EXPLAIN QUERY PLAN und der richtige Index
Wenn eine SQL-Abfrage kriecht, liegt es fast immer an einem fehlenden Index – die Datenbank liest dann die ganze Tabelle durch. Mit EXPLAIN QUERY PLAN siehst du das schwarz auf weiß, und ein Index macht aus SCAN ein schnelles SEARCH.
Eine Abfrage, die bei 100 Zeilen schnell war, wird bei 100.000 Zeilen plötzlich träge. Der Grund ist meistens derselbe: Es fehlt ein Index, und die Datenbank muss die ganze Tabelle durchlesen, um deine Zeilen zu finden. Das Schöne: SQLite verrät dir das selbst.
Sichtbar machen mit EXPLAIN QUERY PLAN
Stell deiner Abfrage einfach EXPLAIN QUERY PLAN voran:
EXPLAIN QUERY PLAN
SELECT * FROM orders WHERE email = 'kunde@example.com';Steht in der Ausgabe SCAN TABLE orders, liest die Datenbank jede einzelne Zeile – das ist der langsame Fall.
Den Index anlegen
CREATE INDEX idx_orders_email ON orders(email);Jetzt dieselbe Abfrage noch einmal mit EXPLAIN QUERY PLAN prüfen. Aus dem SCAN wird nun:
SEARCH orders USING INDEX idx_orders_email (email=?)SEARCH statt SCAN heißt: Die Datenbank springt direkt zu den passenden Zeilen, statt alles durchzugehen. Bei großen Tabellen ist das der Unterschied zwischen Millisekunden und Sekunden.
Die zwei Merksätze
- Indexiere die Spalten, nach denen du filterst oder sortierst – also alles, was hinter
WHERE,JOIN … ONundORDER BYsteht. - Nicht blind alles indexieren. Jeder Index kostet beim Schreiben (INSERT/UPDATE) etwas Zeit und Speicher. Leg Indizes gezielt dort an, wo eine Abfrage nachweislich langsam ist – und prüf den Effekt wieder mit
EXPLAIN QUERY PLAN.
Performance-Themen wie dieses tauchen bei jeder wachsenden App auf. Wenn deine Anwendung langsam geworden ist und du nicht weißt, warum, schau ich mir das gern an – bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Generierte Spalten in SQLite – abgeleitete Werte, die nie veralten
Bruttopreis, Suchspalte in Kleinschreibung, das Jahr aus einem Zeitstempel: Solche Werte doppelt zu pflegen ist eine Einladung an die Inkonsistenz. SQLite kann sie selbst berechnen – und sogar indizieren.
SQLite im Web – WAL-Modus und die PRAGMAs, die „database is locked" beenden
SQLite ist für kleine und mittlere Websites hervorragend – wenn man es richtig einstellt. Vier Zeilen beim Verbindungsaufbau entscheiden darüber, ob parallele Zugriffe funktionieren oder in einer Sperrmeldung enden.
Laufende Summe in SQL – SUM() OVER statt Schleife in der Anwendung
Kontostand nach jeder Buchung, kumulierter Umsatz im Jahr, Restbestand nach jeder Entnahme: Alles dieselbe Frage. Mit einer Fensterfunktion beantwortet die Datenbank sie in einer Abfrage – inklusive gleitendem Durchschnitt.