Wie skalierbar ist SQLite? [geschlossen]

178

Ich habe kürzlich diese Frage zu SQLite vs MySQL gelesen und in der Antwort wurde darauf hingewiesen, dass SQLite nicht gut skaliert werden kann, und die offizielle Website bestätigt dies jedoch irgendwie .

Wie skalierbar ist SQLite und wo liegen die höchsten Grenzwerte?

GateKiller
quelle

Antworten:

429

Gestern habe ich eine kleine Seite veröffentlicht *um Ihren Mitarbeiter zu verfolgen, der eine gemeinsam genutzte SQLite-Datenbank für alle Besucher verwendet hat. Leider lief es trotz der bescheidenen Belastung meines Hosts ziemlich langsam. Dies liegt daran, dass die gesamte Datenbank jedes Mal gesperrt wurde, wenn jemand die Seite betrachtete, da sie Aktualisierungen / Einfügungen enthielt. Ich wechselte bald zu MySQL und obwohl ich nicht viel Zeit hatte, es zu testen, scheint es viel skalierbarer zu sein als SQLite. Ich erinnere mich nur an langsame Seitenladevorgänge und gelegentliche Fehler beim Sperren der Datenbank, wenn versucht wurde, Abfragen von der Shell in SQLite auszuführen. Das heißt, ich führe eine andere Site von SQLite aus. Der Unterschied besteht darin, dass die Site statisch ist (dh ich bin die einzige, die die Datenbank ändern kann) und daher für gleichzeitige Lesevorgänge einwandfrei funktioniert. Moral der Geschichte:

Bearbeiten : Ich habe gerade festgestellt, dass ich SQLite gegenüber möglicherweise nicht fair war. Ich habe keine Spalten in der SQLite-Datenbank indiziert, als ich sie von einer Webseite aus bereitgestellt habe. Dies verursachte teilweise die Verlangsamung, die ich erlebte. Die Beobachtung von Datenbanksperrungen steht jedoch - wenn Sie besonders belastende Updates haben, stimmt die SQLite-Leistung nicht mit MySQL oder Postgres überein.

eine weitere Änderung: Seit ich dies vor fast 3 Monaten gepostet habe, hatte ich die Gelegenheit, die Skalierbarkeit von SQLite genau zu untersuchen, und mit ein paar Tricks kann es ziemlich skalierbar sein. Wie ich in meiner ersten Bearbeitung erwähnt habe, verkürzen Datenbankindizes die Abfragezeit erheblich. Dies ist jedoch eher eine allgemeine Beobachtung zu Datenbanken als zu SQLite. Es gibt jedoch noch einen anderen Trick, mit dem Sie SQLite beschleunigen können: Transaktionen . Wenn Sie mehrere Datenbankschreibvorgänge ausführen müssen, fügen Sie diese in eine Transaktion ein. Anstatt jedes Mal, wenn eine Schreibabfrage ausgegeben wird, in die Datei zu schreiben (und sie zu sperren), wird der Schreibvorgang nur einmal ausgeführt, wenn die Transaktion abgeschlossen ist.

Die Site, die ich im ersten Absatz erwähnt habe, wurde wieder auf SQLite umgestellt und läuft recht reibungslos, sobald ich meinen Code an einigen Stellen optimiert habe.

* Die Seite ist nicht mehr verfügbar

Kyle Cronin
quelle
3
Das "klassische" Datenbankmodul von MySQL, MyISAM, hat dieselben Probleme hinsichtlich gleichzeitiger Lese- / Schreibvorgänge wie SQLite. Tatsächlich sperrt es jede einzelne Zeile, die es in einem Schreibvorgang berührt, und macht es unmöglich, schreibintensive Anwendungen zu skalieren. Trotzdem wurden viele Webanwendungen problemlos bedient.
Henning
1
Könnten Sie dann den Anfang Ihrer Antwort umschreiben? Die Beurteilung der Leistung von DB ohne geeignete Indizes ist völlig unfair. Auch Transaktionen verändern die Leistung und Skalierbarkeit von SQLite erheblich.
Kornel
3
@porneL: Stimmt, aber SQLite ohne Indizes war eine Größenordnung langsamer als MySQL ohne Indizes, und ich habe auch ein wenig über Transaktionen in meine zweite Bearbeitung aufgenommen. Ich denke immer noch, dass das Fortschreiten der Antwort Sinn macht - es zeigt meine anfängliche naive Verwendung von SQLite und wie relativ schlecht die Leistung war. Ich gehe davon aus, dass diejenigen, die neu auf der Plattform sind, auf ähnliche Probleme stoßen werden, und ich hoffe, dass sie sich mit dem ersten Absatz identifizieren können, dann die folgenden Änderungen lesen und erkennen, dass es Möglichkeiten gibt, SQLite zu beschleunigen, um eine akzeptable Leistung zu erzielen.
Kyle Cronin
1
Können Sie uns bitte ungefähr mitteilen, wie viele Zugriffe pro Sekunde Ihre Website erhält?
NoobOverflow
2
In neueren SQLite-Versionen ist auch WAL (Write-Ahead-Logging) verfügbar, wodurch die Schmerzen bei Lese- / Schreibzyklen möglicherweise verringert werden. Dinge ändern sich.
Lasse V. Karlsen
58

Sqlite ist in Bezug auf Einzelbenutzer skalierbar. Ich habe eine Multi-Gigabyte-Datenbank, die sehr gut funktioniert, und ich hatte keine großen Probleme damit.

Da es sich jedoch um Einzelbenutzer handelt, hängt es davon ab, um welche Art von Skalierung es sich handelt.

Als Antwort auf Kommentare. Beachten Sie, dass es nichts , dass verhindert in einer Mehrbenutzerumgebung eine SQLite - Datenbank verwenden, aber jede Transaktion (in der Tat, jede SQL - Anweisung , dass ändert sich die Datenbank) auf dem eine Sperre nimmt Datei , die anderen Benutzern den Zugriff auf die Datenbank verhindern wird bei alle .

Wenn Sie also viele Änderungen an der Datenbank vorgenommen haben, werden Sie im Wesentlichen sehr schnell auf Skalierungsprobleme stoßen. Wenn Sie andererseits im Vergleich zum Schreibzugriff viel Lesezugriff haben, ist dies möglicherweise nicht so schlecht.

Aber SQLite wird natürlich Funktion in einer Multi-User - Umgebung, aber es wird nicht durchführen gut.

Lasse V. Karlsen
quelle
5
SQLite 3 unterstützt das Lesen, wenn andere Benutzer darauf schreiben.
Alix Axel
2
Beachten Sie, dass die obigen Kommentare nicht mehr aktuell sind. Mit dem neuen (er) WAL-System können Schreib- und Lesevorgänge gleichzeitig ausgeführt werden, wodurch die Skalierbarkeit erhöht wird.
Lasse V. Karlsen
Ist es möglich, Datensätze im laufenden Betrieb von jedem rdbms wie SQL Server oder Oracle usw. nach SQLite zu exportieren?
ILoveStackoverflow
29

SQLite steuert die Website sqlite.org und andere Websites mit viel Datenverkehr. Sie schlagen vor, dass SQLite einwandfrei funktionieren sollte , wenn Sie weniger als 100.000 Treffer pro Tag haben. Und das wurde geschrieben, bevor sie die Funktion "Writeahead Logging" lieferten.

Wenn Sie die Arbeit mit SQLite beschleunigen möchten, gehen Sie wie folgt vor:

  • Upgrade auf SQLite 3.7.x.
  • Aktivieren Sie die Write-Ahead-Protokollierung
  • Führen Sie das folgende Pragma aus: "PRAGMA cache_size = Anzahl der Seiten;" Die Standardgröße (Anzahl der Seiten) beträgt 2000 Seiten. Wenn Sie diese Anzahl jedoch erhöhen, wird die Datenmenge erhöht, die direkt aus dem Arbeitsspeicher ausgeführt wird.

Vielleicht möchten Sie sich mein Video auf YouTube mit dem Titel " Verbessern der SQLite-Leistung mit Writeahead-Protokollierung " ansehen, das die Verwendung der Write-Ahead-Protokollierung zeigt und eine 5- fache Geschwindigkeitsverbesserung für Schreibvorgänge demonstriert.

Jay Godse
quelle
24

Sqlite ist eine Desktop- oder In-Process- Datenbank. SQL Server, MySQL, Oracle und ihre Brüder sind Server .

Desktop - Datenbanken sind von Natur aus nicht eine gute Wahl für jede Anwendung , die Bedürfnisse gleichzeitiger Schreibzugriff auf den Datenspeicher zu unterstützen. Dies schließt auf einer bestimmten Ebene die meisten Websites ein, die jemals erstellt wurden. Wenn Sie sich überhaupt anmelden müssen, benötigen Sie wahrscheinlich Schreibzugriff auf die Datenbank.

Joel Coehoorn
quelle
5
Ich würde dem nicht zustimmen: "Dies schließt so ziemlich jede Website ein, die jemals erstellt wurde." Kommentar. Wenn die Website stark ausgelastet ist, sind Sie korrekt. Trac verwendet beispielsweise standardmäßig SQLite und ist für kleine Teams sehr leistungsfähig.
Andrew Burns
2
Geben Sie ihm Zeit: Sie haben zwei Entwickler, die gleichzeitig auf dasselbe Feld zugreifen, und es wird ersticken.
Joel Coehoorn
3
Was definieren Sie als Choke? Aufgrund Ihrer Antwort haben Sie vermutlich nicht viel Erfahrung mit SQLite. SQLite sperrt die gesamte Datei bei Vorgängen, sodass es zu Verzögerungen kommen kann. In der von Ihnen vorgeschlagenen Situation ist es jedoch nahezu unmöglich, sie zu ersticken.
Andrew Burns
3
Andrew, da SQL Lite für kleine Teams gut funktioniert, macht es nicht skalierbar. Um skalierbar zu sein, ist die Anforderung gut skalierbar, was bedeutet, dass es mit großen Teams gut funktionieren sollte. Meines Wissens ist SQL Lite nicht auf große Teams / gleichzeitige Datenbankoperationen skalierbar, die einen relativ niedrigen Schwellenwert überschreiten.
Pop Catalin
5
@Gerechtigkeit. Diese Antwort enthält keine Belege dafür, wie skalierbar SQLite ist. Die Antwort von niemandem ist viel besser.
GateKiller
23

Haben Sie diese SQLite-Dokumente gelesen - http://www.sqlite.org/whentouse.html ?

SQLite eignet sich normalerweise hervorragend als Datenbankmodul für Websites mit geringem bis mittlerem Datenverkehr (dh 99,9% aller Websites). Die Menge an Webdatenverkehr, die SQLite verarbeiten kann, hängt natürlich davon ab, wie stark die Website ihre Datenbank verwendet. Im Allgemeinen sollte jede Site, die weniger als 100.000 Zugriffe pro Tag erzielt, mit SQLite einwandfrei funktionieren. Die Zahl von 100.000 Treffern / Tag ist eine konservative Schätzung, keine harte Obergrenze. Es wurde gezeigt, dass SQLite mit dem 10-fachen Datenverkehr funktioniert.

Sam
quelle
3
Ich stimme dem sehr zu. 99% der Websites können mit SQLLite problemlos verarbeitet werden, wenn Sie dies möchten. Andererseits gehen 99% des Webverkehrs auf die größten 1% der Websites.
Djangofan
7
Die Metrik "100.000 Treffer / Tag" ist völliger Müll. Ein "Treffer" wird normalerweise als HTTP-GET definiert, und eine Website mit einer Reihe von geschnittenen Bildern kann mehr als 40 "Treffer" pro Seitenaufruf erzielen - nichts davon berührt die Datenbank. Selbst wenn die Dokumente den Fehler "hit == pageview" machen, ist dies immer noch irreführend. SQLite sperrt die gesamte Datenbank beim Schreiben. Während es möglicherweise 100.000 Seitenaufrufe von Personen liefert, die nur Datensätze durchsuchen, wird es in einer schreibintensiven Anwendung (E-Commerce, Messageboard usw.) auseinanderfallen.
Jamieb
10

Die Skalierbarkeit von SQLite hängt stark von den verwendeten Daten und deren Format ab. Ich habe einige schwierige Erfahrungen mit extra langen Tischen gemacht (GPS-Aufzeichnungen, eine Aufzeichnung pro Sekunde). Die Erfahrung hat gezeigt, dass SQLite schrittweise langsamer wird, was teilweise auf das ständige Ausbalancieren der wachsenden Binärbäume mit den Indizes zurückzuführen ist (und bei Indizes mit Zeitstempel wissen Sie nur , dass der Baum stark neu ausbalanciert wird, aber dies ist für Sie von entscheidender Bedeutung sucht). Am Ende werden die Abfragen in meinem Fall bei etwa 1 GB (sehr viel, wie ich weiß) träge. Ihr Kilometerstand wird variieren.

Trotz aller Prahlerei ist SQLite NICHT für Data Warehousing gedacht. Es gibt verschiedene Verwendungen , die für SQLite nicht empfohlen werden . Die feinen Leute hinter SQLite sagen es selbst:

Eine andere Sichtweise auf SQLite ist folgende: SQLite ersetzt Oracle nicht. Es soll fopen () ersetzen.

Und dies führt zu dem Hauptargument (nicht quantitativ, sorry, aber qualitativ), dass SQLite nicht für alle Verwendungszwecke geeignet ist, während MySQL viele verschiedene Verwendungszwecke abdecken kann, auch wenn dies nicht ideal ist. Sie könnten beispielsweise MyfQL Firefox-Cookies (anstelle von SQLite) speichern lassen, aber dieser Dienst muss ständig ausgeführt werden. Auf der anderen Seite könnten Sie eine Transaktionswebsite auf SQLite (wie viele andere auch) anstelle von MySQL ausführen, aber mit viel Ausfallzeit rechnen.

MPelletier
quelle
1
Sie können das Problem der Verwendung sehr großer indizierter Tabellen umgehen, indem Sie Ihre Daten aufteilen, z. B. eine Tabelle pro Tag / Woche. Mit SQLite können Sie die Tabellen sogar in verschiedene Datenbankdateien aufteilen und anschließend ATTACH DATABASEeine virtuelle Datenbankverbindung mit allen Tabellen herstellen (jedoch nur auf 62 Datenbanken beschränkt).
Alix Axel
3

Ich denke, dass ein (in Nummer 1) Webserver, der Hunderte von Clients bedient, im Backend mit einer einzigen Verbindung zur Datenbank angezeigt wird, nicht wahr?

Es gibt also keinen gleichzeitigen Zugriff in der Datenbank und daher können wir sagen, dass die Datenbank im Einzelbenutzermodus arbeitet. Unter solchen Umständen ist es nicht sinnvoll, den Mehrbenutzerzugriff zu diskutieren. Daher funktioniert SQLite genauso wie jede andere serverbasierte Datenbank.

Eis
quelle
1
Thx GateKiller, aber bitte geben Sie "Low Volume Website" an.
Eis
3

Denk darüber so. SQL Lite wird jedes Mal gesperrt, wenn jemand es verwendet (SQLite wird beim Lesen nicht gesperrt). Wenn Sie also eine Webseite oder eine Anwendung mit mehreren gleichzeitigen Benutzern bereitstellen, kann nur einer Ihre App gleichzeitig mit SQLLite verwenden. Es gibt also ein Skalierungsproblem. Wenn es sich um eine Ein-Personen-Anwendung handelt, z. B. eine Musikbibliothek, in der Sie Hunderte von Titeln, Bewertungen, Informationen, Verwendung, Wiedergabe und Spielzeit speichern, skaliert SQL Lite wunderbar mit Tausenden, wenn nicht Millionen von Datensätzen (Festplatte bereit).

MySQL hingegen funktioniert gut für Server-Apps, bei denen Benutzer es gleichzeitig verwenden. Es sperrt nicht und ist ziemlich groß. Für Ihre Musikbibliothek wäre MySql also zu Ende, da nur eine Person es sehen würde, es sei denn, dies ist eine gemeinsam genutzte Musikbibliothek, in der Tausende sie hinzufügen oder aktualisieren. Dann wäre MYSQL die richtige Wahl.

Theoretisch skaliert MySQL also besser als Sqllite, da es mehrere Benutzer verarbeiten kann, aber für eine Einzelbenutzer-App übertrieben ist.

Wanderfalke
quelle
5
s / benutzt es / schreibt darauf. SQLite sperrt beim Lesen nicht.
Gregg Lind
5
Nun, Ihre Antwort kann leicht falsch interpretiert werden. SQLite sperrt nur Schreibanforderungen . Wir verwenden SQLite für mehr als 50 GB medizinische Daten in relationaler Form und bedienen Hunderte von gleichzeitigen Webclients zum Durchsuchen und Abfragen. Die Leseleistung ist niemals schlechter als bei einem neueren MySQL.
Berk D. Demir
3
MySQL von MySQL ist für den gleichzeitigen Zugriff nicht viel besser als SQLite. MySQL verwendet häufig Sperren auf Tabellenebene und führt keine gleichzeitigen Schreibvorgänge durch, außer in einigen Fällen, in denen das Layout von MyISAM optimal ist. Wenn Sie sich nicht für InnoDB entscheiden (das seine eigenen Probleme wie das nie verkleinernde Datendatei hat), sind Sie mit MySQL möglicherweise nicht viel besser dran.
Kornel
1

Die Website von SQLite (der Teil, auf den Sie verwiesen haben) gibt an, dass sie für eine Vielzahl von Mehrbenutzersituationen verwendet werden kann.

Ich würde sagen, dass es ziemlich viel kann. Nach meiner Erfahrung war es immer sehr schnell. Natürlich müssen Sie Ihre Tabellen indizieren und beim Codieren sicherstellen, dass Sie parameritisierte Abfragen und dergleichen verwenden. Grundsätzlich das gleiche, was Sie mit jeder Datenbank tun würden, um die Leistung zu verbessern.

jle
quelle
und Transaktionen verwenden. Das ist entscheidend für SQLite.
Kornel
-1

Es könnte sich lohnen, REAL SQL Server zu testen , einen auf SQLite basierenden Datenbankserver.

Paul Lefebvre
quelle
7
Ich glaube nicht, dass eine Site es rechtfertigt, 299 US-Dollar für "REAL SQL Server" auszugeben, wenn die meisten Sites nicht genug Verkehr haben, um überhaupt die Grenzen von SQLLite zu erreichen.
Djangofan