SQLite
Performance
Datenbank
Entwicklung

SQLite-Performance meistern: Jenseits der Basics

1. November 2025
HarborDB Team

SQLite ist die am weitesten verbreitete Datenbank der Welt. Sie befindet sich in Ihrem Telefon (iOS & Android), Ihrem Browser, Ihrem Mac und wahrscheinlich sogar in Ihrer Mikrowelle (kein Scherz). Standardmäßig ist SQLite so konfiguriert, dass es sicher und kompatibel ist, nicht unbedingt rasend schnell. Wenn Sie SQLite für eine ernsthafte Desktop-Anwendung oder einen datenintensiven Prozess verwenden, müssen Sie unter die Haube schauen.

In diesem Beitrag behandeln wir die Techniken, die wir bei HarborDB verwendet haben, um Millionen von Zeilen in Millisekunden abzufragen.

1. Das Wichtigste zuerst: Aktivieren Sie WAL

Wenn Sie nichts anderes tun, tun Sie dies. Der Write-Ahead Logging (WAL)-Modus verändert die Parallelität von SQLite erheblich. Standardmäßig verwendet SQLite ein Rollback-Journal. Das bedeutet, dass beim Schreiben eines Prozesses niemand sonst lesen kann (oder umgekehrt, je nach Locking-Modus).

Der WAL-Modus ermöglicht:

  • Gleichzeitige Leser und Schreiber.
  • Schnelleres Schreiben (da "checkpointing" sequentiell ist).

So aktivieren Sie es:

PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;

Hinweis: PRAGMA synchronous = NORMAL ist sicher, solange die Festplatte nicht physisch beschädigt wird oder der Strom ausfällt. Für Desktop-Apps ist es der perfekte Kompromiss.

2. Massen-Inserts und Transaktionen

Der häufigste Fehler von Anfängern ist das Einfügen von Zeilen in einer Schleife ohne Transaktion.

Der langsame Weg (Python Beispiel):

# Führen Sie das NICHT aus. Es wird ewig dauern.
for row in data:
    cursor.execute("INSERT INTO users VALUES (?)", row)
    conn.commit() # Autocmmit für JEDE Zeile!

SQLite muss auf das Drehen der physischen Festplatte (oder den Sync-Befehl der SSD) für jeden Insert warten.

Der schnelle Weg:

conn.execute("BEGIN TRANSACTION")
for row in data:
    cursor.execute("INSERT INTO users VALUES (?)", row)
conn.commit()

Geschwindigkeitsunterschied: Oft 100x bis 1000x schneller.

3. Indizes: Nutzen Sie sie weise

Ein Index ist eine geordnete Kopie Ihrer Daten. Er macht das Lesen extrem schnell, aber das Schreiben etwas langsamer (da Sie sowohl die Tabelle als auch den Index aktualisieren müssen).

Der goldene Index-Tipp

Verwenden Sie EXPLAIN QUERY PLAN, bevor Sie raten.

EXPLAIN QUERY PLAN SELECT * FROM logs WHERE severity = 'ERROR';

Wenn Sie SCAN TABLE sehen, tun Sie es falsch (es liest jede Zeile). Wenn Sie SEARCH TABLE USING INDEX sehen, sind Sie auf dem richtigen Weg.

Erstellen Sie einen Index:

CREATE INDEX idx_logs_severity ON logs(severity);

4. PRAGMA-Optimierungen für Power-User

Hier sind einige weniger bekannte Befehle, die wir bei HarborDB nutzen:

  • PRAGMA temp_store = MEMORY; Zwingt SQLite, temporäre Tabellen und Indizes im RAM zu halten, anstatt auf die Festplatte zu schreiben. Wenn Sie viel RAM haben, ist das ein großer Gewinn.

  • PRAGMA mmap_size = 30000000000; Dies verwendet Memory-Mapped I/O für den Zugriff auf die DB-Datei. Das Betriebssystem kümmert sich um das Caching. Bei großen Lesevorgängen kann dies die I/O-Latenz fast eliminieren.

  • PRAGMA cache_size = -2000; Legt fest, wie viele Seiten SQLite im Speicher hält. Negative Zahlen bedeuten Kilobyte (hier ~2MB). Positive Zahlen bedeuten Seitenanzahl. Erhöhen Sie dies für große Abfragen.

5. Anwendungsorientierte Architekturen

Manchmal liegt das Problem nicht bei SQL, sondern in Ihrem Code. Bei HarborDB verschieben wir schwere Leseoperationen in einen Hintergrund-Thread, während die UI reaktionsfähig bleibt. Da wir den WAL-Modus aktiviert haben, blockiert der Hintergrund-Thread nicht, wenn der Benutzer kleine Änderungen an der UI vornimmt (Schreiben).

Zusammenfassung

SQLite ist keine "Spielzeug"-Datenbank. Sie ist ein leistungsstarkes Werkzeug, das massive Workloads bewältigen kann, wenn Sie es richtig behandeln.

  1. Aktivieren Sie WAL.
  2. Wrappen Sie Writes immer in Transaktionen.
  3. Verwenden Sie Indizes für WHERE-Klauseln.
  4. Optimieren Sie den Speicher mit PRAGMAs.

Viel Erfolg beim Optimieren!