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
Volltextsuche in SQLite mit FTS5 – schneller und besser als LIKE '%wort%
LIKE '%suchwort%' kann keinen Index nutzen und liest bei jeder Suche die ganze Tabelle. FTS5 ist in SQLite eingebaut, findet auch Wortanfänge und sortiert die Treffer nach Relevanz – ohne Elasticsearch daneben.
Keyset-Pagination – warum LIMIT ... OFFSET auf Seite 500 kriecht
OFFSET 10000 heißt für die Datenbank: zehntausend Zeilen lesen und wegwerfen. Und wenn zwischendurch jemand etwas einfügt, sieht der Nutzer beim Blättern denselben Eintrag zweimal. Beides löst dieselbe Umstellung.
JSON in SQLite abfragen – json_extract und der ->>-Operator
Ein JSON-Feld in der Datenbank ist bequem, bis man danach filtern will. SQLite kann direkt hineinschauen – und mit einem Index auf dem richtigen Ausdruck ist das sogar schnell.